
Обробка stl-рядків
Як уже зазначалося, у С++ рядки можна розглядати як об’єкти шаблонного класу string, описаного в стандартній бібліотеці шаблонів STL (Standard Template Library). Тому такі рядки ще називають STL-рядками. Щоб використовувати рядки класу string, треба підключити до програми заголовний файл <string>:
#include <string>.
Обробка STL-рядків має певну специфіку. Зокрема, STL-рядкам можна присвоювати значення, як і змінним будь-яких інших типів:
string name; // створення рядка name
name = “Row”; // присвоєння значення рядковій змінній name
Введення або виведення STL-рядків виконується застосуванням перевантажених для рядків операцій потокового введення та виведення (”<<” і ”>>”). Наприклад,
string s;
cin >> s;
cout << s << endl;
Однак слід пам’ятати, що таким способом рядки вводяться тільки до першого роздільного символу (пробілу, кінця рядка, символу табуляції). Для введення рядка-речення слід скористатися функцією getline класу string:
string s; // створення рядка s
getline(cin, s); // читання введеного з клавіатури рядка
cout << s<<endl; // одержання довжини рядка
STL-рядки можна лексикографічно порівнювати між собою, користуючись звичайними операціями порівняння (”= =”, ”>” і т.ін.):
if (str == “Hello”)
cout << str << endl;
Для string-об'єктів визначена також операція додавання (”+” ), тобто можна написати s1 + s2 і результатом цієї операції буде конкатенація (об’єднання) рядків: рядок s2 буде дописаний в кінець рядка s1. Наприклад,
string str(“Hello”);
string r = str + ‘ ’ + “world”; //конкатенація трьох рядків
r += ‘!’; //r = “Hello world!”
Основна функціональність STL-рядків реалізується через методи класу string. Методом в ООП називають функцію, яка застосовується до об'єкта вказаного класу, наприклад, рядка. При виклику метода його ім'я пишеться після ідентифікатора об'єкта через крапку. Наприклад, у об'єкта типу string є метод length, який повертає довжину рядка. Якщо str - це рядок, то метод викликається так: str.length().
Даний клас дозволяє досить ефективно і легко вирішувати наступні задачі:
створювати, присвоювати, копіювати і видаляти рядки;
виконувати перетворення типів символьних змінних;
порівнювати рядки;
поєднувати рядки;
визначати довжину рядка;
знаходити і заміщати потрібний фрагмент у рядку.
Перелік деяких методів обробки string-рядків наведений у табл. 10
Таблиця 10. Перелік основних методів обробки STL-рядків
Назва |
Опис |
empty |
перевіріє, чи є рядок порожнім (якщо рядок порожній, повертає true) |
erase |
видаляє символ або декілька символів з рядка |
find |
шукає підрядок в рядку; |
insert |
вставляє підрядоку рядок |
length |
повертає довжину рядка |
replace |
видаляє підрядок |
substr |
виділяє підрядок рядка |
swap |
обмінює вмісти двох рядків |
Наприклад,
string str1(“Hello”);
string str2=“greetings”;
if (str1.empty()) cout << "String is empty" << "\n";
else cout << "String isn't empty" << "\n";
cout << str1.length(); //повертає 5 (довжину рядка str1)
cout << str2.find(“ее”); //повертає 2 (позицію самого лівого входження “ее”)
string s(“Testing!”);
cout << s.substr(2, 5); // “sting”
cout << s[3]; // ‘t’
s.replace(2, 2,”eth”); // s == “Teething!”
s.erase(1, 4); // s == “Ting!”
s[1] = ‘a’; // s == “Tang!”
s.insert(1,”w”); // s == “Twang!”
Також існує багато варіацій цих методів (табл. 11).
Таблиця 11. Перелік варіацій деяких методів обробки STL-рядків
Прототип |
Опис |
unsigned int find (string substr); |
шукає підрядок substr в рядку; повертає індекс, з якого починається перше входження підрядка в рядок |
unsigned int findC(string substr, unsigned int from); |
шукає підрядок substr в рядку, починаючи з позиції from |
unsigned int find_first_of (string substr); |
шукає перше входження будь-якого символа із substrврядку |
unsigned int find_first_not_of(string substr); |
шукаєперший символ врядку, який не входить в substr |
unsigned int find_ last _of (string substr); |
шукає останнє входження будь-якого символа із substr врядку |
unsigned int find_last_not_of(string substr); |
шукаєостанній символ врядку, який не входить в substr |
unsigned int rfind(string substr); |
шукає останнє входження підрядка substr в рядок; повертає індекс, з якого починається останнє входження підрядка в рядок |
unsigned int rfindC(string substr, unsigned int from); |
шукає останній підрядок substr в рядку, індекс початку якого менше from |
string substr(unsigned int n); або |
виділяє підрядок, що містить перші n символів рядка |
string substr(unsigned int k, unsigned int n); |
виділяє підрядок, що містить перші n символів рядка, починаючи з k-го |
Наприклад,
string str(“Hello, World!”);
cout << str.rfind(‘o’); //виконує пошук з кінця (повертає 8)
int index = str.find_first_of(", !"); // пошук першого пробілу, знаку оклику або коми
Для позначення того, що шукана послідовність символів не знайдена, багато методів (наприклад, find) повертають спеціальну константу npos, яка означає «не знайдено» або «всі символи, що залишилися». Наприклад,
string str(“Hello”);
cout << str.find(“x”) // повертає string::npos
Для того, щоб використовувати все розмаїття методів обробки STL-рядків, під рукою повинна бути відповідна документація. Microsoft пропонує досить докладну документацію, як частину MSDN для своєї реалізації STL.
Хоча значна частина функціональності роботи з рядками реалізована в бібліотеці <string.h> (функції strcmp, strcat, strcpy, strlen та ін.), але використання string-об'єктів часто буває зручнішим.
Для роботи з рядками передбачений шаблонний клас basic_string з якого визначається клас string:
typedef basic_string <char> string;
Клас string відрізняється від vector<char> функціями для маніпулювання рядками й політикою роботи з пам'яттю. Для визначення довжини рядка, використовується string::length(), а не vector::size().
Розглянемо приклад роботи з рядками.
string sl = "слово";
string s1 = sl.substr(0, 3), // "сло"
s2 = sl.substr(1, 3), // "лов"
s3 = sl.substr(0, s.length()-1), //"слов"
s4 = sl.substr(1), // "лово"
s = "Завтра - термін здачі лабораторної !";
// пошук першого пробілу
int ind1 = s.find_first_of(' ');
// пошук першого пробілу, знаків ! або -
int ind2 = s.find_first_of(" -!");
Також рядки можна додавати за допомогою оperator+, порівнювати за допомогою операторів порівняння. Таким чином, vector<string> можна впорядковувати стандартними методами. Рядки порівнюються в лексикографічному порядку
Не существует серьезной библиотеки, которая бы не включала в себя свой класс для представления строк или даже несколько подобных классов. STL - строки поддерживают как формат ASCII, так и формат Unicode.
string- представляет из себя коллекцию, хранящую символы char в формате ASCII. Для того, чтобы использовать данную коллекцию, вам необходимо включить #include <string>.
wstring- это коллекция для хранения двухбайтных символов wchar_t, которые используются для представления всего набора символов в формате Unicode. Для того, чтобы использовать данную коллекцию, вам необходимо включить #include <xstring>.
int string_length(char []);
void main(void)
{ char title[] = " Learning to program in C++";
char lesson[] = "Сharacter strings";
cout << " String " << title << " contains " << string_length(title) << " characters" << endl;
cout << " String " << lesson << " contains " << string_length(lesson) << " characters" << endl;
}
int string_length(char string[])
{ int i;
for (i = 0; string[і] != '\0'; i++);
return i;
}