Язык программирования C++. Пятое издание - Стенли Липпман
Шрифт:
Интервал:
Закладка:
s.replace(11, 3, "Fifth"); // s == "С++ Primer Fifth Ed."
В этом вызове удаляются три символа, но вместо них вставляются пять.
Таблица 9.13. Функции изменения содержимого строки
s.insert(pos, args) Вставка символов, определенных аргументом args, перед позицией pos. Позиция pos может быть задана индексом или итератором. Версии, получающие индекс, возвращают ссылку на строку s, а получающие итератор возвращают итератор, обозначающий первый вставленный символ s.erase(pos, len) Удаляет len символов, начиная с позиции pos. Если аргумент len пропущен, удаляет символы от позиции pos до конца строки s. Возвращает ссылку на строку s s.assign(args) Заменяет символы строки s согласно аргументу args. Возвращает ссылку на строку s s.append(args) Добавляет аргумент args к строке s. Возвращает ссылку на строку s s.replace(range, args) Удаляет диапазон range символов из строки s и заменяет их символами, заданными аргументом args. Диапазон задан либо индексом и длиной, либо парой итераторов. Возвращает ссылку на строку s Аргументы args могут быть одним из следующих: функции append() и assign() могут использовать все формы. Строка str должна быть отлична от s, а итераторы b и е не могут принадлежать строке s str Строка str str, pos, len До len символов из строки str, начиная с позиции pos cp, len До len символов из символьного массива, на который указывает указатель cp cp Завершающийся нулевым символом массив, на который указывает указатель cp n, c n копий символа с b, e Символы в диапазоне, указанном итераторами b и е Список инициализации Разделяемый запятыми список символов, заключенный в фигурные скобки Аргументы args для функций replace() и insert() зависят от того, использован ли диапазон или позиция replace(pos,len,args) replace(b,е,args) insert(pos,args) insert(iter,args) Возможные аргументы args Да Да Да Нет str Да Нет Да Нет str, pos, len Да Да Да Нет cp, len Да Да Нет Нет cp Да Да Да Да n, с Нет Да Нет Да b2, e2 Нет Да Нет Да список инициализации Множество способов изменить строкуФункции append(), assign(), insert() и replace(), перечисленные в табл. 9.13, имеют несколько перегруженных версий. Аргументы этих функций зависят от того, как заданы добавляемые символы и какая часть строки изменится. К счастью, у этих функций общий интерфейс.
У функций assign() и append() нет необходимости определять изменяемые части строки: функция assign() всегда заменяет все содержимое строки, а функция append() всегда добавляет в конец строки.
Функция replace() предоставляет два способа определения диапазона удаления символов. Диапазон можно определить по позиции и длине или парой итераторов. Функция insert() предоставляет два способа определения позиции вставки: при помощи индекса или итератора. В любом случае новый элемент (элементы) вставляется перед указанным индексом или итератором.
Существует несколько способов определения символов, добавляемых в строку. Новые символы могут быть взяты из другой строки, из указателя на символ, из заключенного в фигурные скобки списка символов или как символ и как число. Когда символы исходят из строки или указателя на символ, можно передать дополнительные аргументы, указывающие, копируются ли все символы аргумента или только часть.
Не каждая функция поддерживает все версии этих аргументов. Например, нет версии функции insert(), получающей индекс и список инициализации. Аналогично, если необходимо определить точку вставки, используя итератор, невозможно будет впоследствии передать символьный указатель как источник для новых символов.
Упражнения раздела 9.5.2Упражнение 9.43. Напишите функцию, получающую три строки: s, oldVal и newVal. Используя итераторы, а также функции insert(), и erase() замените все присутствующие в строке s экземпляры строки oldVal строкой newVal. Проверьте функцию на примере замены таких общепринятых сокращений, как "tho" на "though" и "thru" на "through".
Упражнение 9.44. Перепишите предыдущую функцию так, чтобы использовались индекс и функция replace().
Упражнение 9.45. Напишите функцию, получающую строку, представляющую имя и две другие строки, представляющие префикс, такой, как "Mr." или "Ms.", а также суффикс, такой, как "Jr." или "III". Используя итераторы, а также функции insert() и append(), создайте новую строку с суффиксом и префиксом, добавленным к имени.
Упражнение 9.46. Перепишите предыдущее упражнение, используя на сей раз позицию, длину и функцию insert().
9.5.3. Операции поиска строк
Класс string предоставляет шесть вариантов функций поиска, у каждой из которых есть четыре перегруженных версии. Функции-члены поиска и их аргументы описаны в табл. 9.14. Каждая из них возвращает значение типа string::size_type, являющееся индексом найденного элемента. Если соответствие не найдено, функции возвращают статический член (см. раздел 7.6) по имени string::npos. Библиотека определяет значение npos как -1 типа const string::size_type. Поскольку npos имеет беззнаковый тип, это означает, что значение npos соответствует наибольшему возможному размеру, который может иметь любая строка (см. раздел 2.1.2).
Таблица 9.14. Строковые функции поиска
Функции поиска возвращают индекс искомого символа или значение npos, если искомое не найдено s.find(args) Ищет первое местоположение аргумента args в строке s s.rfind(args) Ищет последнее местоположение аргумента args в строке s s.find_first_of(args) Ищет первое местоположение любого символа аргумента args в строке s s.find_last_of(args) Ищет последнее местоположение любого символа аргумента args в строке s s.find_first_not_of(args) Ищет первое местоположение символа в строке s, который отсутствует в аргументе args s.find_last_not_of(args) Ищет последнее местоположение символа в строке s, который отсутствует в аргументе args Аргумент args может быть следующим с, pos Поиск символа с, начиная с позиции pos в строке s. По умолчанию pos имеет значение 0 s2, pos Поиск строки s2, начиная с позиции pos в строке s. По умолчанию pos имеет значение 0 cp, pos Поиск строки с завершающим нулевым символом в стиле С, на которую указывает указатель cp. Поиск начинается с позиции pos в строке s. По умолчанию pos имеет значение 0 cp, pos, n Поиск первых n символов в массиве, на который указывает указатель cp. Поиск начинается с позиции pos в строке s. Аргумент pos и n не имеет значения по умолчаниюФункции поиска строк возвращают значение беззнакового типа string::size_type. Поэтому не следует использовать переменную типа int или другого знакового типа для содержания значения, возвращаемого этими функциями (см. раздел 2.1.2).