std::string
std::string — это класс для организации работы со строками.
В отличие от большинства языков, строки в C++ изменяемые.
Создание
auto s1 = std::string(); // ""
auto s2 = std::string(4, '0'); // "0000"
auto s3 = std::string("text");
std::string s4 = "text";
std::string s5 = {'t', 'e', 'x', 't'};
using namespace std::string_literals;
auto s6 = "text"s;
Доступ к содержимому
Для доступа к элементам есть методы at, front и back, operator[].
Все они возвращают ссылку на символ.
std::string s = "012345";
char ch1 = s[1]; // '1'
char ch2 = s.at(3); // '3'
char ch3 = s.front(); // '0'
char ch4 = s.back(); // '5'
Размер, количество символов:
std::string s = "text";
s.empty(); // false
s.size(); // 4
s.length(); // 4
s.reserve(50);
s.capacity(); // 50
Доступ к данным (C-style string):
std::string s = "text";
const char* p1 = s.c_str();
char* p2 = s.data(); // no const
Подстроки
Получить подстроку можно двумя способами:
- через начальную позицию и длину
- через начальную и конечную позицию
const char* raw = "hello world";
std::string s = raw;
// "world"
auto s1 = s.substr(6);
auto s2 = std::string(s, 6);
// "hello"
auto s3 = s.substr(0, 5);
auto s4 = std::string(s, 0, 5);
// "lo wo"
auto s5 = std::string(raw + 3, raw + 8);
auto s6 = std::string(s.begin() + 3, s.begin() + 8);
Поиск
Для поиска подстроки есть методы find и rfind (поиск с конца).
В качестве аргумента можно указать как символ, так и другую строку.
Также можно указать позицию, с которой нужно начинать поиск;
по умолчанию для find это 0, а для rfind это npos.
Если подстрока найдена, будет возвращена позиция символа, иначе вернёт
std::string::npos (константа, равна 0xffffffffffffffff).
std::string s = "hello world";
s.find(':'); // npos
s.find('o'); // 4
s.find("o", 5); // 7
s.rfind('l'); // 9
s.rfind("ll"); // 2
Кроме этого есть метод contains, позволяющий узнать, присутствует ли
в строке заданный символ или подстрока.
std::string str = "some text";
std::string substr = "some";
str.contains('t'); // true
str.contains("123"); // false
str.contains(substr); // true
Модификация строки
Присвоение нового значения
Для присвоения нового значения строке, помимо оператора =, можно использовать
метод assign. Он присваивает новое значение строке "на месте" ("in place").
std::string str;
std::string newStr = "new";
str.assign("raw"); // "" -> "raw"
str.assign(newStr); // "raw" -> "new"
str.assign(newStr, 1, 1); // "new" -> "e"
str.assign(3, 'w'); // "e" -> "www"
Изменение отдельно взятого символа
std::string s = "hello world";
s[0] = 'H';
s.at(6) = 'W';
std::cout << s; // "Hello World"
Изменение части строки, замена
Для замены части строки другой строкой или частью строки используется
метод replace.
std::string s = "123 ??? 789";
s.replace(4, 3, "456"); // "123 456 789"
size_t a = 1;
size_t b = 10;
s.replace(a, b - a, ".."); // "1..9"
Вставка
Для вставки символов или подстроки в определенное место используется метод
insert. Первый аргумент — это позиция в строке, куда будет вставлен
фрагмент, а остальные аргументы зависят от того, что нужно вставить.
std::string s = "a";
s.insert(0, 1, 'd'); // "a" -> "da"
s.insert(2, "ta"); // "da" -> "data"
std::string addition = "big pig";
s.insert(0, addition, 0, 4); // "data" -> "big data"
Для вставки в конец строки есть методы append и push_back.
std::string s1 = "a";
s1.append(1, 'b').append("cd");
s1.push_back('e');
// s1 == "abcde"
std::string s2 = "data";
std::string addition = "_base_";
s2.append(addition, 1, 4);
// s2 == "database"
Конкатенация:
std::string s1 = "hello";
std::string s2 = "world";
auto s = s1 + ' ' + s2;
s += '!';
s += "!!";
std::cout << s; // "hello world!!!"
Удаление
Для удаления символов или подстроки используется метод erase. Этот метод
предоставляет различные варианты удаления, позволяя указывать начальную
позицию и количество символов для удаления.
Ещё есть метод pop_back, позволяющий удалить символ с конца,
и метод clear, очищающий строку.
std::string s1 = "overlook";
s1.erase(1, 6); // s1 == "ok"
s1.pop_back(); // s1 == "o"
s1.clear(); // s1 == ""
std::string s2 = "up to date";
s2.erase(s2.begin() + 2, s2.end() - 4);
// s2 == "update"
Алгоритмическая сложность
Доступ к содержимому:
at: O(1)operator[]: O(1)front: O(1)back: O(1)data: O(1)empty: O(1)size: O(1)length: O(1)max_size: O(1)capacity: O(1)
Сравнение и поиск:
compare: O(n)find: O(n)rfind: O(n)
Модификация содержимого:
clear: O(n)insert: O(n)erase: O(n)push_back: O(n)pop_back: O(1)append: O(n)replace: O(n)
Управление памятью:
reserve: O(n)shrink_to_fit: O(n)