20 Методи класу string
Методи-модифікатори рядка
Цей модифікатор замінює рядок або вказаний діапазон у вихідному рядку. Підрядок заміни не обов'язково повинен мати той же розмір, що і замінний підрядок. 1. Заміна підрядка, вказану діапазоном [pos, pos + count), на рядок other_str (other_str може бути як об'єктом класу string, так і C-рядком):
або із зазначенням діапазону з other_str
2. Підрядок для заміни можна отримати і за допомогою ітераторів:
3. Нарешті, можна замінити count символами ch:
Програма 20.1 У заданому рядку поміняти місцями перше та останнє слово рядка. Розділювачами слів вважаються прогалини.
resize() змінює розмір рядка, щоб він міг містити count символів. Якщо поточний розмір менший за count , то будуть додані додаткові символи ch (не обов'язковий аргумент).
Спосіб clear() видаляє всі символи рядка. Але обсяг масиву (capacity) залишається незмінним.
Цей метод замінює вміст рядка 1. Або рядком other_str ( other_str може бути як об'єктом класу string , так і C-рядком):
2. чи діапазоном який вказують итераторы:
3. або (що аналогічно попередньому) підрядком [pos, pos + count) з рядка other_str. У цьому випадку pos не повинен перевищувати myStr.size().
Розглянемо приклад. Дано рядок S1. Цей рядок ділиться навпіл. Перша половина рядка міститься у рядок S2 , а друга – у рядок S3 . Замінити вихідний рядок на рядок, що складається з 20 символів '*' . Вивести рядки S1, S2 та S3. Змінити рядки S1 та S2 так, щоб перші сім символів рядка S2 та останні сім символів рядка S3 були замінені на символирядки S1. Вивести модифіковані рядки S2 та S3.Програма 20.2
Методи empty, erase, insert, find та константа npos
Незважаючи на те, що erase() та insert() формально є модифікаторами, вони часто використовуються в програмі з методом find(), тому ми розглянемо роботу з цими методами у цій частині заняття.
Метод empty() перевіряє рядок відсутність у ній символів. Це логічна функція, вона повертає true , якщо рядок порожній, інакше false() .
Цей метод видаляє вказані символи з рядка. erase() може використовуватися у двох варіантах:
Перший варіант видаляє символ позиції ітератора, другий – в діапазоні [first, last). Обидва варіанти повертають ітератор, що вказує на символ, що йде за останнім віддаленим символом.
Вставляє символ, певну кількість символів або діапазон символів у позицію ітератора it :
У всіх випадках повертається ітератор вставки (у позиції наступної за останнім символом).
find() знаходить перший підрядок, що дорівнює переданому рядку, підрядку або символу (ch), починаючи з позиції pos , необов'язковий аргумент count – перші count символів рядка other_str ( other_str може бути як об'єктом класу string , так і C-рядком). Якщо pos == 0 то опустити можна і його. Повертає size_type.
Метод повертає позицію першого символу знайденого підрядка або npos (див. нижче), якщо підрядок не знайдено. Для пошуку підрядки не з початку, а з кінця існує аналогічний метод rfind() .
Константа string::npos
Це спеціальне значення, що дорівнює максимальному значенню, яке може надати тип size_type . Точний зміст цього значення залежить від контексту, але, як правило, воно використовується або як індикатор кінця рядка вфункціях, які очікують на позицію символу (програма 20.1), або як індикатор помилки у функціях, які повертають позицію у рядку (програма 20.3). Приклад завдання. Дано рядки S і S0. Видалити з рядка S всі підрядки, що збігаються з S0. Якщо підрядків, що збігаються, немає, то вивести рядок S без змін.Програма 20.3
Ці три методи призначені для копіювання.
Цей метод повертає підрядок, отже, застосовується в операціях з наданням або може бути використаний як аргумент інших методів та функцій.
Метод swap() дозволяє обмінюватися вмістом між двома рядками myStr та other_str .
Розглянемо приклад завдання. Дано цілі позитивні числа N1 і N2 і рядки S1 і S2. Отримати з цих рядків новий рядок, що містить перші символи N1 рядка S1 і останні N2 символів рядка S2 (в зазначеному порядку). Здійснити обмін елементами між рядками S1 і S2. Вивести змінені рядки.Програма 20.4
Посимвольна обробка у циклах
Для доступу до окремого символу рядка використовуються або операція звернення за індексом [] (наприклад, myStr[i] , як у C-масивах), або метод at() (наприклад, myStr.at(i) ). У цьому використовується звичайний цикл for. Якщо зміна розміру рядка не передбачається, то кращим вибором буде не звичайний for , а range-based for . Метод at() здійснює контроль виходу за межі масиву і якщо це станеться, то буде згенеровано виняток out_of_range. Отже, цьому методу потрібно надавати перевагу використанню операції звернення за індексом []. Фрагмент програми, в якій проводиться обхід символьного масиву за допомогою традиційного for і range-based for :
Примітка. Нагадуємо, що подвійна лапка і знак питання є спеціальними.символами, які мають екрануватись символом '\' (керуючі послідовності). Примітка. Нагадуємо, що діапазонний цикл for (range-based for)не можна використовувати для масивів, які, в процесі обробки, змінюють свій розмір (а таким може бути об'єкт класу string). Якщо використовується заголовний файл cctype (або cwctype для широких символів), то стають доступними функції для роботи з окремими символами рядка.
- isalnum() iswalnum() перевіряє, чи є символ буквено-цифровим. Наприклад: if (isalnum(r))
- isalpha() iswalpha() перевіряє, чи є символ буквеним
- isdigit() iswdigit() перевіряє, чи є символ цифрою
- isxdigit() iswxdigit() перевіряє, чи є символ шістнадцятковою цифрою
- iscntrl() iswcntrl() перевіряє, чи є символ керуючим символом
- isspace() iswspace() перевіряє, чи є символ символом пропуску
- islower() iswlower() перевіряє, чи є символ символом у нижньому регістрі
- isupper() iswupper() перевіряє, чи є символ символом великої літери
- ispunct() iswpunct() перевіряє, чи символ символу пунктуації
- tolower() towlower() перетворює символ на нижній регістр. Наприклад: r = tolower(r)
- toupper() towupper() перетворює символ у верхній регістр
Примітка. Аргументами функцій бібліотеки cwctype мають бути широкі символи (wchar_t)!Програма 20.5
Числові перетворення
Функції числових перетворень (увійшли до стандарту C++11) застосовуються для рядків типів string і wstring (додаткових заголовків не потрібно).
stoi(), stol(), stoll()
- перетворює рядок назнакове ціле число
stoul(), stoull()
stof(), stod(), stold()
to_string(), to_wstring()
value – числове значення для перетворення
Рядкові потоки
Раніше ми обговорили можливість використання циклу while та потоку введення для читання введеного рядка за словами. Однак найкращою альтернативою такому підходу буде використання класу рядкових потоків. Рядкові потоки здійснюють введення/виведення в оперативній пам'яті та використовують буфер для запису в рядок та читання з рядка, як стандартні або файлові потоки. Заголовок sstream визначає три класи рядкових потоків:
- istringstream Строкове введення
- ostringstream Рядковий висновок
- stringstream Строкове введення та виведення
Ці класи успадковують методи класів istream, ostream та iostream, відповідно. Якщо для стандартних потоків об'єкти введення/виводу (cin і cout) зумовлені, то для рядкових потоків вони мають бути створені розробником. (Зрозуміло, необхідно дотримуватись правил використання ідентифікаторів. Наприклад, допустимими іменами об'єктів можуть бути: is, os, stream, record тощо). Об'єкт рядкового введення створюється як екземпляр класу istringstream. Аналогічно, об'єкт потоку рядкового виведення створюється як екземпляр класу ostringstream. Рядкові потоки дуже зручно застосовувати, коли потрібно проводити аналіз та зміну слів у рядку. Таким чином, можна здійснювати контроль введення/виведення користувача. Розглянемо застосування вхідного рядкового потоку. Вводиться п'ять рядків. Визначити в тексті кількість літер у найдовшому слові.Програма 20.7
Для рядкових потоків описано спеціальний метод str() . Цей метод недоступний інших потокових класах. Він виконує подвійнуроль. Якщо функція немає аргументів (як у програмі, нижче), то повертається копія рядка, яку зберігає потоковий об'єкт ( os ). Якщо функція має аргумент (яким є рядок, що передається), то аргумент копіюватиметься в потоковий об'єкт. Розглянемо приклад завдання, у якому застосовується як вхідний, і вихідний рядковий потік. Даний рядок, в якому слова розділені пробілами (пробіли не повторюються). Отримати новий рядок, в якому слова розділені символом '.' (крапка). Наприкінці рядка точки не має бути.
Програма 20.8
Для того, щоб завершальний (нульовий) символ не сприймався як ще одне слово, ми скористалися методом ignore() (успадковується з базового класу istream) для вилучення та видалення його з вхідного рядкового потоку