Модификация строк. Вставка и удаление символов

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

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

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий