Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

22.7.1. Огляд функцій-членів класу string

Якщо найпростіші операції з рядками можна реалізувати за допомогою операторів, то у процесі виконання складніших не обійтися без функцій-членів класу string. Клас string містить дуже багато функцій-членів, ми ж розглянемо тут тільки самі споживані з них.

Необхідно пам'ятати! Оскільки клас string- контейнер, він підтримує такі звичайні контейнерні функції, як begin(), end() і size().

Основні маніпуляції над рядками

Щоб присвоїти один рядок іншому, використовується функція assign(). Ось як виглядають два можливі формати її реалізації:

string &assign(const string &strob, size_type start size_type num);

string &assign(const char *str, size_type num);

Перший формат дає змогу присвоїти об'єкту, що викликається, num символів з рядка, які задаються параметром strob, починаючи з індексу start. Під час використання другого формату об'єкту, що викликається, присвоюються перші num символів рядка, що завершується нульовим символом, які задаються параметром str. У кожному випадку повертається посилання на зухвалий об'єкт. Звичайно, набагато простіше для присвоєння одного повного рядка іншій використовувати оператор "=". Про функцію-члена assign() згадують, в основному, тоді, коли потрібно присвоїти тільки частину рядка.

За допомогою функції-члена класу append() можна частину одного рядка приєднати у кінець іншої. Два можливі формати її реалізації мають наступний вигляд.

string &append(const string &strob, size_type start size_type num);

string &append(const char *str, size_type num);

У цих записах під час використання першого формату лшп символів з рядка, які задаються параметром strob, починаючи з індексу start, буде приєднано у кінець того, об'єкт, який викликає. Другий формат дає змогу приєднати у кінець об'єкта, що викликається перші пив символів рядка, що завершується нульовим символом, які задаються параметром str. У кожному випадку повертається посилання на зухвалий об'єкт. Звичайно, набагато простіше для приєднання одного повного рядка у кінець іншій використовувати оператор додавання "+". Функція ж append() застосовується тоді, коли необхідно приєднати у кінець об'єкта, що викликається тільки частину рядка.

Вставку або заміну символів у рядку можна виконувати за допомогою функцій-членів класу insert() і replace(). Ось як виглядають прототипи їх найбільш споживаних форматів.

string &insert(size_type start, const string &strob);

string &insert(size_type start, const string &strob,

size_type insStart size_type num|);

string &replace(size_type start size_type num|, const string &strob);

string &replace(size_type start size_type orgNum,

const string &strob,

size_type replaceStart,

size_type replaceNum);

Перший формат функції insert() дає змогу вставити рядок, які задаються параметром strob, у позицію зухвалого рядка, задану параметром start. Другий формат функції insert() призначений для вставки num символів з рядка, які задаються параметром strob, починаючи з індексу insStart, у позицію зухвалого рядка, задану параметром start.

Перший формат функції replace() слугує для заміни лив? символів у рядку, що викликається, починаючи з індексу start, рядком, заданим параметром strob. Другий формат дає змогу замінити orgNum символів у рядку, що викликається, починаючи з індексу start, replaceNum символами рядка, які задаються параметром strob, починаючи з індексу replaceStart. У кожному випадку повертається посилання на зухвалий об'єкт.

Видалити символи з рядка можна за допомогою функції erase(). Один з її форматів має такий вигляд:

string &erase(size_type start = 0 size_type num| = прози);

Ця функція видаляє літ символів із зухвалого рядка, починаючи з індексу start. Функція повертає посилання на зухвалий об'єкт.

Використання функцій insert(), erase() і replace() продемонстровано у наведеному нижче коді програми.

Код програми 22.18. Демонстрація механізму використання функцій insert(), erase() і replace()

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

#include <string> // Для роботи з рядками

using namespace std; // Використання стандартного простору імен

int main()

{

string str1 ("Це простий тест.");

string str2("ABCDEFG");

cout << "Початкові рядки:\n";

cout << "str1: " << str1 << endl;

cout << "str2: " << str2 << "\n\n";

// Демонструємо використання функції insert().

cout << "Вставляємо рядок str2 у рядок str1:\n";

str1.insert(5, str2);

cout << str1 << "\n\n";

// Демонструємо використання функції erase().

cout << "Видаляємо 7 символів з рядка str1:\n";

str1.erase(5, 7);

cout << str1 <<"\n\n";

// Демонструємо використання функції replace().

cout << "Замінюємо 2 символи в str1 рядком str2:\n";

str1.replace(5, 2, str2);

cout << str1 << endl;

getch(); return 0;

}

Результати виконання цієї програми є такими:

Початкові рядки:

str1: Це простий тест.

Str2: ABCDEFG

Вставляємо рядок str2 у рядок str1: Це пАВСВЕРОростой тест.

Видаляємо 7 символів з рядка str1: Це простий тест.

Замінюємо 2 символи в str1 рядком str2: Це пАВСВЕРСстой тест.

Пошук у рядку

У класі string передбачено декілька функцій-членів класу, які здійснюють пошук. Це, наприклад, такі функції, як find() і rfind(). Розглянемо прототипи самих споживаних версій цих функцій.

size_type find(const string &strob,

size_type start = 0) const;

size_type rfind(const string &strob,

size_type start=npos) const;

Функція find(), починаючи з позиції start, проглядає викликаючий рядок на предмет пошуку першого входження рядка, які задаються параметром strob. Якщо пошук успішний, функція find() повертає індекс, за яким у рядку, що викликається, був виявлений збіг. Якщо збігу не виявлено, повертається значення прози. Функція rfind() виконує та ж дія, але з кінця. Починаючи з позиції start, вона проглядає викликаючий рядок у зворотному порядку на предмет пошуку першого входження рядка, які задаються параметром strob (тобто вона знаходить у рядку, що викликається, останнє входження рядка, які задаються параметром strob). Якщо пошук пройшов вдало, функція find() повертає індекс, за яким у рядку, що викликається, був виявлений збіг. Якщо збігу не виявлено, повертається значення прози.

Розглянемо короткий приклад використання функції find().

Код програми 22.19. Демонстрація механізму використання функції find()

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

#include <string> // Для роботи з рядками

using namespace std; // Використання стандартного простору імен

int main()

{

int izm;

string s1 = "Клас string полегшує оброблення рядків.";

string s2;

izm = s1.find("string");

if(izm !=string::npos) {

cout << "Збіг виявлений у позиції " << izm << endl;

cout << "Залишок рядка такий: ";

s2.assign(s1, izm, s1.size());

cout << s2;

}

getch(); return 0;

}

Програма відображає на екрані такі результати:

Збіг виявлений у позиції 6

Залишок рядка такий: string полегшує оброблення рядків.

Порівняння рядків

Щоб порівняти повний вміст одного string-об'єкта з іншим, звичайно використовуються описані вище перевантажені оператори відношення. Але, якщо потрібно порівняти частину одного рядка з іншою, Вам доведеться використовувати функцію-члена compare().

int compare(size_type start size_type num,

const string &strob) const;

Функція compare() порівнює із викликаючим рядком літ символів рядка, які задаються параметром strob, починаючи з індексу start. Якщо викликаючий рядок менший від рядка strob, функція compare() поверне негативне значення. Якщо викликаючий рядок більший від рядка strob, вона поверне позитивне значення. Якщо рядок strob дорівнює рядку, що викликається, функція compare() поверне нуль.

Отримання рядка, що завершується нульовим символом

Незважаючи на незаперечну корисність об'єктів типу string, можливі ситуації, коли Вам доведеться отримувати з такого об'єкта символьний масив, що завершується нулем, тобто його версію С-рядки. Наприклад, Ви могли б використовувати string-об'єкт для створення імені файлу. Але, відкриваючи файл, Вам потрібно задати покажчик на стандартний рядок, що завершується нульовим символом. Для вирішення цього питання і використовується функція-член c_str(). Ось як виглядає її прототип:

const char *c_str() const;

Ця функція повертає покажчик на С-версію рядки (тобто на рядок, що завершується нульовим символом), яка міститься у викликаючому об'єкті типу string. Отриманий рядок, що завершується нульовим символом, зміні не підлягає. Окрім того, після виконання інших операцій над цим string-об'єктом допустимість застосування отриманої С-рядки не гарантується.