На этом шаге мы рассмотрим особенности выполнения этих операций.
В классе string определены многочисленные функции вставки, удаления и замены символов строки. Присоединение символов в конец строки выполняется оператором +=, функциями append() и push_back(). Пример:
const std::string aString("othello"); std::string s; s +- aString; // Присоединение строки "othello" s += "two\nlines"; // Присоединение С-строки s += '\n'; // Присоединение отдельного символа s.append(aString); // Присоединение строки "othello" (эквивалент +=) s.append(aString,1,3); // Присоединение подстроки "the" s.append(aString,2,std::string::npos); // Присоединение подстроки "hello" s.append("two\nlines"); // Присоединение С-строки (эквивалент +=) s.append("nico",5); // Присоединение символьного массива: n, i, с, о, \0 s.append(5.'х'); // Присоединение пяти символов: х, х, х, х, х s.push_back('\n'); // Присоединение одного символа (эквивалент +=)
Оператор += присоединяет строковое значение, определяемое одним аргументом. Функция append() позволяет определить присоединяемое значение несколькими аргументами. Одна из перегруженных версий append() присоединяет к строке интервал символов, заданный двумя итераторами. Поддержка функции push_back() была добавлена для конечных итераторов вставки, чтобы алгоритмы STL могли использоваться для присоединения символов к строкам (конечные итераторы вставки рассматриваются на 223 шаге).
Функция insert(), предназначениая для вставки символов, также существует в нескольких версиях. При вызове функции передается индекс символа, за которым вставляются новые символы:
const std::string aString('age"); std::string s("p"); s.insert(1,aString); // s:page s.insert(l,"ersifl"); // s:persiflage
Не существует версии insert(), которая бы получала индекс и одиночный символ. Следовательно, при вызове необходимо передавать строку или дополнительное число:
s.insert(0, ' '); // ОШИБКА s.insert(0," "); // OK
Также можно попытаться использовать следующий вызов, но это означает потенциальную неоднозначность:
s.insert(0,1,' '); // ОШИБКА: неоднозначность
Причина неоднозначности - функция insert() перегружена для двух сигнатур:
insert (size_type idx, size_type num, charT с); // Позиция определяется индексом insert (iterator pos, size_type num, charT с); // Позиция определяется итератором
Для типа string тип size_type обычно определяется как unsigned, а тип iterator - как char*. В этом случае для первого аргумента 0 существуют два равноправных преобразования. Следовательно, для получения желаемого результата приходится использовать запись:
s.inert((std::string::size_type)0,l,' '); // OK
Вторая интерпретация этой неоднозначности являет собой пример вставки символов с применением итераторов. Если вы хотите задать позицию вставки при помощи итератора, это можно сделать тремя разными способами:
По аналогии с рассмотренными функциями функции erase() (удаление символов) и replace() (замена) тоже существуют в нескольких версиях. Пример:
std::string s = "i18n"; // s:i18n s.replace(1,2,"nternaliozation"); // s:internationalization s.erase(13); // s:international s.erase(7,5); // s:internal s.replace(0,2,"ex"); // s:external
Функция resize() изменяет количество символов в строке. Если новый размер, переданный в аргументе функции, меньше текущего количества символов, то лишние символы удаляются с конца строки. Если новый размер больше текущего количества символов, то новые символы добавляются в начало. Новый символ, добавляемый при увеличении размеров строки, передается в необязательном аргументе. Если он отсутствует, используется конструктор по умолчанию для типа символов (то есть \0 для типа char).
На следующем шаге мы рассмотрим подстроки и конкатенацию.