Справочник по C/C++
Строки в языке C++

В языке C++ поддержка строк осуществляется двумя способами. Первый состоит в использовании символьного массива, завершающегося нулевым символом. Такой массив иногда называется С-строкой. Второй способ подразумевает работу с объектом класса типа basic_string. Существует две специализации типа basic_string: тип string, который поддерживает символьные строки, и тип wstring, который поддерживает строки, образованные двухбайтовыми символами. Чаще всего используются строковые объекты типа string. Для использования строковых классов C++ необходимо включить в программу заголовок .

Класс basic_string по сути является контейнером. Это значит, что итераторы и алгоритмы STL могут обеспечить работу со строками. Однако строки обладают дополнительными возможностями.

Тип basic_string использует класс char_traits, который определяет ряд атрибутов символов, составляющих строку. Важно понимать, что, поскольку большинство строк состоит из символов либо типа char, либо типа wchar_t, класс basic_string в состоянии обработать любой объект, который может быть использован для представления текстового символа.

Спецификация шаблона для класса basic_string имеет следующий вид.

template ,
	class Allocator = allocator> class basic_string 

Здесь CharType - тип используемого символа, Attr - класс, в котором описаны атрибуты этого символа, и класс Allocator задает распределитель. Класс basic_string имеет следующие конструкторы.

explicit basic_string{const Allocator
		&a = Allocator());

basic_string(size_type len, CharType ch,
		const Allocator &a = Allocator());

basic_string(const CharType *str,
		const Allocator &a = Allocator());

basic_string(const CharType *str, size_type len, 
		const Allocator &a = Allocator)));

basic_string(const basic_string &str, size_type indx = 0,
		size_type len=npos, const Allocator &a = Allocator());

template  basic_string(InIter start,
		InIter end, const Allocator &a = Allocator());

Первая форма конструктора создает пустую строку. Вторая форма создает строку, которая содержит len символов со значением ch. Третья создает строку, которая содержит такие же элементы, как и строка str. Четвертая формирует строку, которая содержит подстроку str, начинающуюся с нулевого(по счету) символа, и имеет длину, равную len символов. Пятая создает строку из другого класса basic_string, используя подстроку, которая начинается с символа indx и имеет длину, равную len символов. Наконец, шестая форма создает строку, которая содержит элементы в диапазоне, заданном параметрами start и end.

Для класса basic_string определены следующие операторы сравнения:

==, <, <=, !=, > и >=.

Также определены оператор +, выполняющий конкатенацию двух строк, и операторы ввода-вывода << и >>, которые можно использовать для ввода и вывода строк.

Оператор + можно использовать для конкатенации одного строкового объекта с другим или строкового объекта со строкой, созданной в С-стиле. Другими словами, поддерживаются следующие операции.

строка + строка
строка + С-строка
С-строка + строка

Оператор + можно использовать для добавления символа в конец строки.

В классе basic_string определена константа npos, которая обычно равна -1. Она представляет размер строки максимально возможной длины.

В приведенных ниже описаниях обобщенный тип CharType представляет тип символа, сохраняемого строкой. Поскольку имена типов в шаблонном классе являются произвольными, в контейнерных классах объявляются typedef-версии этих типов, что конкретизирует имена типов. Ниже перечислены часто используемые типы, определенные в классе basic_string.

size_type Некоторый целый тип, эквивалентный типу size_t
reference Ссылка на символ const-ссылка на символ
const_reference Итератор const-итератор
iterator Итератор
const_iterator const-итератор
reverse_iterator Реверсивный итератор
const_reverse_iterator  Реверсивный const-итератор
value_type Тип символа, сохраненного в строке
allocator_type Тип распределителя
pointer Указатель на символ внутри строки
const_pointer const-указатель на символ внутри строки
traits_type typedef-имя для char_traits
difference_type Тип, который может хранить разность двух адресов

В следующей таблице приведены функции-члены, определенные в классе basic_string. Поскольку подавляющее большинство программистов используют char-строки(в том числе в целях упрощения описания), в таблице использован тип string, но следует помнить, что эти функции также применяются к объектам типа wstring(или любого другого типа, определенного в классе basic_string).

Функция-член Назначение
Операторы строк
reference operator[](size_type indx) const;
const_reference operator[](size_type indx) const;
Возвращает ссылку на символ, заданный параметром indx
string &operator=(const string &str);
string &operator=(const CharType *str);
string &operator=(CharType ch);
Присваивает заданную строку или символ данной строке. Возвращает указатель *this
string &operator+=(const string &str);
string &operator+=(const CharType *str);
string &operator+=(CharType ch);
Добавляет заданную строку или символ в конец данной строки. Возвращает указатель *this
Итераторы
iterator begin();
const_iterator begin() const;
Возвращает итератор для первого элемента в строке
iterator end();
const_iterator end() const;
Возвращает итератор, указывающий на конец строки
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
Возвращает реверсивный итератор, указывающий на конец строки
reverse_iterator rend();
const_reverse_iterator rend() const;
Возвращает реверсивный итератор, указывающий на начало строки
Добавление
string &append(const string &str); Добавляет подстроку str в конец данной строки. Возвращает указатель *this
string &append(const string &str, size_type indx, size_type len); Добавляет подстроку str в конец данной строки. Добавляемая подстрока начинается с позиции indx и имеет длину 1 ел символов. Возвращает указатель *this
string &append(const CharType *str); Добавляет подстроку s tr в конец данной строки. Возвращает указатель *this
string &append(const CharType *str, size_type num); Добавляет первые num символов из строки str в конец данной строки. Возвращает указатель *this
string &append(size_type len, char CharType ch); Добавляет len символов, заданных параметром ch, в конец данной строки. Возвращает указатель *this
template string &append(InIter start, InIter end); Добавляет последовательность, заданную параметрами start и end, в конец данной строки. Возвращает указатель *this
Присваивание
string &assign(const string &str); Присваивает подстроку str данной строке. Возвращает указатель *this
string &assign(const string &str, size_type indx, size_type len); Присваивает подстроку str данной строке. Присваиваемая подстрока начинается с позиции indx и имеет длину len символов. Возвращает указатель *this
string &assign(const CharType *str); Присваивает подстроку str данной строке. Возвращает указатель *this
string &assign(const CharType *str, size_type len); Присваивает данной строке первые len символов из строки str. Возвращает указатель *this
string &assign(size_type len, CharType ch); Присваивает данной строке len символов, заданных параметром ch. Возвращает указатель *this
template string &assign{InIter start, InIter end); Присваивает данной строке последовательность, заданную параметрами start и end. Возвращает указатель *this
Поиск
size_type find(const string &str, size_type indx = 0) const; Возвращает индекс первого вхождения строки str внутри данной строки. Поиск начинается с индекса indx. Если совпадения не обнаружено, возвращает значение npos
size_type find(const CharType *str, size_type indx = 0) const; Возвращает индекс первого вхождения строки str внутри данной строки. Поиск начинается с индекса indx. Если совпадения не обнаружено, возвращает значение npos
size_type find(const CharType *str, size_type indx, size_type len) const; Возвращает индекс первого вхождения первых len символов строки str внутри данной строки. Поиск начинается с индекса indx. Если совпадения не обнаружено, возвращает значение npos
size_type find(CharType ch, size_type indx = 0) const; Возвращает индекс первого вхождения символа ch внутри данной строки. Поиск начинается с индекса indx. Если совпадения не обнаружено, возвращает значение npos
size_type find_first_of(const string &str, size_type indx = 0) const; Возвращает индекс первого символа внутри данной строки, который совпадает с любым символом в строке str. Поиск начинается с индекса indx. Если совпадения не обнаружено, возвращает значение npos
size_type find_first_of(const CharType *str, size_type indx = 0) const; Возвращает индекс первого символа внутри данной строки, который совпадает с любым символом в строке str. Поиск начинается с индекса indx. Если совпадения не обнаружено, возвращает значение npos
size_type find_first_of(const CharType *str, size_type indx, size_type len) const; Возвращает индекс первого символа внутри данной строки, который совпадает с любым символом в первых len символах строки str. Поиск начинается с индекса indx. Если совпадения не обнаружено, возвращает значение проs
size_type find_first_of(CharType ch, size_type indx = 0) const; Возвращает индекс первого вхождения символа ch внутри данной строки. Поиск начинается с индекса indx. Если совпадения не обнаружено, возвращает значение nроs
size_type find_first_not_of(const string &str, size_type indx = 0) const; Возвращает индекс первого символа внутри данной строки, который не совпадает ни с каким символом в строке str. Поиск начинается с индекса indx. Если несовпадения не обнаружено, возвращает значение npos
size_type find_first_not_of(const CharType *str, size_type indx = 0) const; Возвращает индекс первого символа внутри данной строки, который не совпадает ни с каким символом в строке str. Поиск начинается с индекса indx. Если несовпадения не обнаружено, возвращает значение npos
size_type find_first_not_of(const CharType *str, size_type indx, size_type len) const; Возвращает индекс первого символа внутри данной строки, который не совпадает ни с одним символом в первых len символах строки str. Поиск начинается с индекса indx. Если несовпадения не обнаружено, возвращает значение npos
size_type find_first_not_of(CharType ch, size_type indx = 0) const; Возвращает индекс первого символа внутри данной строки, который не совпадает с символом ch. Поиск начинается с индекса indx. Если несовпадения не обнаружен(), возвращает значение npos
size_type find_last_of(const string &str, size_type indx = npos) const; Возвращает индекс последнего символа внутри данной строки, который совпадает с любым символом в строке str. Поиск начинается с индекса indx. Если совпадения не обнаружено, возвращает значение npos
size_type find_last_of(const CharType *str, size_type indx = npos) const; Возвращает индекс последнего символа внутри данной строки, который совпадает с любым символом в строке str. Поиск начинается с индекса indx. Если совпадения не обнаружено, возвращает значение npos
size_type find_last_of(const CharType *str, size_type indx, size_type len) const; Возвращает индекс последнего символа внутри данной строки, который совпадает с любым символом в первых len символах строки str. Поиск начинается с индекса indx. Если совпадения не обнаружено, возвращает значение npos
size_type find_last_of{CharType ch, size_type indx = npos) const; Возвращает индекс последнего вхождения символа ch внутри данной строки. Поиск начинается с индекса indx. Если совпадения не обнаружено, возвращает значение npos
size_type find_last_not_of(const string &str, size_type indx = , npos) const; Возвращает индекс последнего символа внутри данной строки, который не совпадает ни с одним символом в строке str. Поиск начинается с индекса indx. Если несовпадения не обнаружено, возвращает значение npos
size_type find_last_not_of(const CharType *str, size_type indx = npos) const; Возвращает индекс последнего символа внутри данной строки, который не совпадает ни с одним символом в строке str. Поиск начинается с индекса indx. Если несовпадения не обнаружено, возвращает значение npos
size_type find_last_not_of(const CharType *str, size_type indx, size_type len) const; Возвращает индекс последнего символа внутри данной строки, который не совпадает ни с одним из первых len символов строки str. Поиск начинается с индекса indx. Если несовпадения не обнаружено, возвращает значение npos
size_type find_last_not_of(CharType ch, size_type indx = npos) const; Возвращает индекс последнего символа внутри данной строки, который не совпадает с символом ch. Поиск начинается с индекса indx. Если несовпадения не обнаружено, возвращается значение npos
size_type rfind(const string &str, size_type indx = npos) const; Возвращает индекс последнего вхождения строки str внутри данной строки. Поиск начинается с позиции, заданной индексом indx. Если совпадения не обнаружено, возвращает значение npos
size_type rfind(const CharType *str, size_type indx = npos) const; Возвращает индекс последнего вхождения строки str внутри данной строки. Поиск начинается с позиции, заданной индексом indx. Если совпадения не обнаружено, возвращает значение npos
size_type rfind(const CharType *str, size_type indx, size_type len) const; Возвращает индекс последнего вхождения первых len символов строки str внутри данной строки. Поиск начинается с позиции, заданной индексом indx. Если совпадения не обнаружено, возвращает значение npos
size_type rfind(CharType ch, size_type indx = npos) const; Возвращает индекс последнего вхождения символа ch внутри данной строки. Поиск начинается с позиции, заданной индексом indx. Если совпадения не обнаружено, возвращает значение npos
Сравнение
int compare(const string &str) const; Сравнивает строку str с данной строкой. Возвращает одно из следующих значений: меньше нуля, если *this < str; нуль, если *this == str; больше нуля, если *this > str
int compare(size_type indx, size_type len, const string &str) const; Сравнивает строку str с подстрокой внутри данной строки. Эта подстрока начинается с позиции indx и содержит len символов. Возвращает одно из следующих значений: меньше нуля, если *this < str; нуль, если *this == str; больше нуля, если *this > str
int compare(size_type indx, size_type len, const string &str, size_type indx2, size_type len2) const; Сравнивает подстроку в строке str с подстрокой внутри данной строки. Подстрока в данной строке начинается с позиции indx и содержит len символов. Подстрока в строке str начинается с позиции indx2 и содержит len символов. Функция возвращает одно из следующих значений: меньше нуля, если *this < str; нуль, если *this == str; больше нуля, если *this > str
int compare(const char CharType *str) const; Сравнивает строку str с данной строкой. Функция возвращает одно из следующих значений: меньше нуля, если *this < str; нуль, если *this == str; больше нуля, если * this > str
int compare(size_type indx, size_type len, const char CharType *str, size_type len2 = npos) const; Сравнивает подстроку в строке str с подстрокой внутри данной строки. Подстрока в данной строке начинается с позиции indx и содержит len символов. Подстрока в строке str начинается с нулевой позиции и содержит len2 символов. Функция возвращает одно из следующих значений: меньше нуля, если *this < str; нуль, если *this == str; больше нуля, если *this > str
Вставка
iterator insert(iterator i, const CharType &ch); Вставляет символ ch непосредственно перед символом, заданным итератором i. Возвращает итератор для этого символа
string &insert(size_type indx, const string &str); Вставляет строку str в данную строку в позиции, заданной индексом indx. Возвращает указатель *this
string &insert(size_type indx1, const string &str, size_type indx2, size_type len); Вставляет подстроку строки str в данную строку в позиции, заданной индексом indx1. Подстрока начинается с позиции, заданной индексом indx2, и содержит len символов. Возвращает указатель *this
string &insert(size_type indx, const CharType *str); Вставляет строку str в данную строку в позиции, заданной индексом indx. Возвращает указатель *this
string &insert(size_type indx, const CharType *str, size_type len); Вставляет первые len символов строки str в данную строку в позиции, заданной индексом indx. Возвращает указатель *this
string &insert(size_type indx, size_type len, CharType ch); Вставляет len символов со значением ch в данную строку в позиции, заданной индексом indx. Возвращает указатель *this
void insert(iterator i, size_type len, const CharType &ch); Вставляет len копий символа ch непосредственно перед элементом, заданным итератором i
template void insert(iterator i, InIter start, InIter end); Вставляет последовательность, заданную параметрами start и end, непосредственно перед элементом, заданным итератором i.
Замена
string &replace(size_type indx, size_type len, const string &str); Заменяет до len символов в данной строке, начиная с позиции indx, строкой str. Возвращает указатель *this
string &replace(size_type indx1, size_type len1, const string &str, size_type indx2, size_type len2); Заменяет до len1 символов в данной строке, начиная с позиции indxl, символами(в количестве 1en2) строки str, начиная с позиции indx2. Возвращает указатель *this
string &replace(size_type indx, size_type len, const CharType *str); Заменяет до len символов в данной строке, начиная с позиции indx, строкой str. Возвращает указатель *this
string &replace(size_type indx1, size_type len1, const CharType *str, size_type len2); Заменяет до len1 символов в данной строке, начиная с позиции indxl, символами(в количестве len2) строки str, начиная с позиции indx2. Возвращает указатель *this
string &replace(size_type indx, size_type len1, size_type len2, CharType ch); Заменяет до len1 символов в данной строке, начиная с позиции indx, символами(в количестве 1еп2), заданными параметром ch. Возвращает указатель *this
string &replace(iterator start, iterator end, const string &str); Заменяет диапазон, заданный параметрами start и end, строкой str. Возвращает указатель *this
string &replace(iterator start, iterator end, const CharType *str); Заменяет диапазон, заданный параметрами start и end, строкой str. Возвращает указатель *this
string &replace(iterator start, iterator end, const CharType *str, size_type len); Заменяет диапазон, заданный параметрами start и end, первыми len символами строки str. Возвращает указатель *this
string &replace(iterator start, iterator end, size_type len, CharType ch); Заменяет диапазон, заданный параметрами start и end, символами(в количестве len), заданными параметром ch. Возвращает указатель *this
template string &replace(iterator startl, iterator endl, InIter start2, InIter end2); Заменяет диапазон, заданный параметрами start1 и end1, символами из диапазона, заданного параметрами start2 и end2. Возвращает указатель *this
Удаление
iterator erase(iterator i); Удаляет символ, адресуемый параметром i. Возвращает итератор для символа, расположенного за удаленным символом
iterator erase(iterator start, iterator end); Удаляет символы в диапазоне, задаваемом параметрами start и end. Возвращает итератор для символа, расположенного за последним удаленным символом
string &erase(size_type indx =0, size_type len = npos); Начиная с позиции indx, удаляет len символов из данной строки. Возвращает указатель *this
Копирование
size_type copy(CharType *str, size_type len, size_type indx = 0) const; Начиная с позиции indx, копирует len символов из данной строки в символьный массив, адресуемый параметром str. Возвращает количество скопированных символов
Другие функции
reference at(size_type indx);
const_reference at(size_type indx) const;
Возвращает ссылку на символ, заданный параметром indx
const CharType *c_str() const; Возвращает указатель на версию данной строки в С-стиле(т.е. с завершающим нулевым символом)
size_type capacity() const; Возвращает текущую емкость строки - число символов, которое она может содержать до того, как ей придется запросить дополнительную память
const CharType *data() const; Возвращает указатель на первый символ в данной строке
bool empty(} const; Возвращает true, если данная строка пуста, и false в противном случае
allocator_type get_allocator() const; Возвращает распределитель строки
size_type length() const; Возвращает количество символов в строке
size_type max_size() const; Возвращает максимальное количество символов, которое может содержаться в строке
void reserve(size_type num = 0); Устанавливает емкость строки равной не менее значения num
void resize(size_type num); void resize(size_type num, CharType ch); Изменяет размер строки, делая его равным значению, заданному параметром. Чтобы строку(при необходимости) удлинить, в ее конец следует добавить элементы со значением, заданным параметром ch
size_type size() const; Возвращает текущее количество символов в строке
string substr(size_type indx = 0, size_type Jen = npos) const; Возвращает подстроку(внутри данной строки), состоящую из len символов, начиная с позиции indx
void swap(string &str); Выполняет обмен символов данной строки и символов строки str


Совет программисту

Если с традиционными, созданными в С-стиле строками было всегда легко работать, то строковые классы C++ делают обработку строк совершенно простой. Например, с помощью объектов string можно использовать оператор присваивания(для назначения строковым объектам заключенных в кавычки строк), операторы отношений(для сравнения строк), а также множество функций обработки строк, которые значительно облегчают операции с подстроками. Рассмотрим, например, следующую программу.

// Демонстрация работы со строками.
#include 
#include 
using namespace std;

int main()
{

	string str1 = "abcdefghijklmnopqrstuvwxyz";
	string str2;
	string str3(str1);

	str2 = str1.substr(10, 5);

	cout << "str1: " << str1 << endl;
	cout << "str2: " << str2 << endl;
	cout << "str3: " << str3 << endl;

	str1.replace(5, 10, "");
	cout << "str1.replace(5, 10, \"\"):" << str1 << endl;

	str1 = "one";
	str2 = "two";
	str3 = "three";

	cout << "str1.compare(str2): ";
	cout << str1.compare(str2) << endl;

	if (str1 < str2) cout << "str1 меньше str2\n";

	string str4 = str1 + " " + str2 + " " + str3;
	cout << "str4: " << str4 << endl;

	int i = str4.find("wo");
	cout << "str4.substr(i): " << str4.substr(i);

	return 0;
}

Ниже приведен результат работы этой программы.

Strl: abcdefghijklmnopqrstuvwxyz
str2: klmno
str3: abcdefghijklmnopqrstuvwxyz
str1.replace(5, 10, ""): abcdepqrstuvwxyz
str1.compare(str2): -1
str1 меньше str2
str4: one two three
str4.substr(i): wo three

Обратите внимание на простоту выполнения обработки строк. Например, оператор + используется для конкатенации, а оператор < - для сравнения двух строк. Чтобы выполнить эти операции со строками с завершающими нулевыми символами в С-стиле, потребуется сделать менее удобные вызовы функций strcat() и strcmp(). Поскольку в языке С++ объекты string можно свободно смешивать со строками с завершающими нулевыми символами в С-стиле, от их применения в программе нет никакого ущерба - наоборот, следует ожидать значительного выигрыша.