Шаг 375.
Библиотека STL.
Строки. Модификация строк. Вставка и удаление символов

    На этом шаге мы рассмотрим особенности выполнения этих операций.

    В классе 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).

    На следующем шаге мы рассмотрим подстроки и конкатенацию.




Предыдущий шаг Содержание Следующий шаг