Для работы со строкам в C++ используется тип string
. В разделе про потоки мы уже создавали объекты типа string
и использовали их с операторами <<
и >>
. Рассмотрим этот тип подробнее.
Примеры создания объектов string
:
string a; // пустая строка
string b("abc"); // строка проинициализирована списком символов
string c1(b); // c1 является копией b
string c2 = b; // c2 является копией b
string d('d', 10); // d = "dddddddddd"
Строки хранят в памяти последовательность объектов char
, поэтому во многих случаях со строками можно работать как с массивом. Например, обращаться к символам через индекс.
string a("abz");
char c = a[2]; // 'z'
char b = a.at(1); // 'b'
a[2] = 'c'; // a = "abc"
Механизмы обращения к элементу через оператор []
и с помощью метода at()
отличаются. В первом случае не происходит проверки того, что индекс меньше, чем длина строки. Если это условие не выполняется, то мы приходим к ситуации неопределенного поведения. Метод at()
выполняет эту проверку и генерирует исключение в случае некорректного индекса. За это более безопасное поведение мы платим процессорным временем для дополнительной проверки.
По символам строки можно пройти в цикле:
string s("abcde");
for (char ch : s) {
cout << ch << ' ';
}
Узнать длину строки можно с помощью метода size()
.
Строки можно конкатенировать с помощью оператора +
или метода append
:
string a("Hello, ");
string b("world!");
string c = a + b; // "Hello, world!"
a.append(b); // a = "Hello, world!"
a += b; // a = "Hello, world!world!"
Добавить символ в конец строки можно с помощью метода push_back()
, а удалить последний символ - с помощью метода pop_back()
.
Для строк определены все операторы сравнения ==
, !=
, >
, <
, >=
, <=
, выполняющие лексикографическое сравнение.
В типе string
реализованы некоторые алгоритмы. Например, можно осуществлять поиск по строке:
string line("There are two needles in this haystack with needles.");
string query("needle");
size_t found = line.find(query); // found = 14
if (found != string::npos) {
cout << "first '" << query << "' found at: " << found << '\n';
}
Метод find()
возвращает позицию первого символа, которому соответствует совпадение. Если совпадений не найдено, возвращается специальная константа. size_t
- это беззнаковый целочисленный тип.
Больше возможностей типа string
можно найти в документации.