Теоретичні відомості

2.1. Рядки

Рядок у C + + - це масив символів, що закінчується нуль-символом - '\ 0' (нуль-термінатором). За положенням нуль-термінатора визначається фактична довжина рядка. Кількість елементів у такому масиві на 1 більше, ніж зображення рядки.

A \0   A
”A” строка (2 байта)   ’A’ символ (1 байт)

Рисунок 20 – Подання рядки і символу

Присвоїти значення рядку за допомогою оператора привласнення не можна. Помістити рядок в масив можна або при введенні, або за допомогою ініціалізації.

char s1 [10] = "string1";/ / ініціалізація

char s2 [] = "string2";/ / ініціалізація

char s3 [10];

cin >> s3;/ / введення

/ / виділення пам'яті під динамічну рядок

char * s4 = new char [strlen (s3) +1];

strcpy (s4, s3);/ / копіювання рядка s3 в рядок s4

Для роботи з рядками існують спеціальні бібліотечні функції, які містяться в заголовному файлі string.h.

В С++ з'явилася дуже корисна бібліотека роботи з рядками. Вона досить ефективна і дозволяє легко вирішувати наступні задачі:

1. Створювати, присвоювати, копіювати і видаляти рядки.

2. Виконувати перетворення типів символьних змінних.

3. Порівнювати рядки.

4. Поєднувати рядки.

5. Визначати довжину рядка.

6. Знаходити і заміщати потрібний фрагмент у рядку.

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

string hi(“hello”); // створення й ініціалізація нового рядка

string lo=“greetings”; // ще одна ініціалізація

string es=””; // порожній рядок

Рядковим змінним можна присвоювати значення, як змінним будь-яких інших типів:

string name(“Fred”);

name = “Flintstone”; // зміна імені

При цьому всі операції розподілу пам'яті будуть виконані коректно. Операції введення та виведення (<< і >>) перевантажені і для рядків, тому виконати введення або виведення рядка дуже легко.

#include <iostream> //заголовний файл з бібліотеки STL

#include <string>

using namespace std;

int main()

{

string s;

while (cin >> s) // зчитування кожного слова зі стандартного потоку cin

cout << s << endl; // виведення кожного слова в окремому рядку

return 0;

}

Операція + перевантажена для рядків і означає конкатенацію. Операції порівняння (==, > і т.д.) теж перевантажені для рядків.

string hi(“hello”);

string lo=”greetings”;

string r = hi + ‘ ’ + “world”; // конкатенація трьох рядків

r += ‘!’; // так теж можна! (r = “hello world!”)

r = string(3, ‘!’); // r = “!!!”;

if (hi == “hello”)

if (lo > “great”)

if (lo < hi)

У бібліотеці міститься ще декілька корисних функцій, використання яких демонструється на наступному прикладі:

cout << hi.find(“ll”); // повертає 2 (позицію самого лівого входження “ll”)

cout << hi.find(‘l’); // працює завдяки автоматичному приведенню типів

cout << hi.rfind(‘l’); // виконує пошук з кінця (повертає 3)

cout << lo.find(“g”); // повертає 0 (положення самого лівого входження ‘g’)

cout << lo.find(“g”, 5); // повертає 7 (саме ліве входження ‘g’ після 5).

cout << hi.find(“x”) // повертає string::npos

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!”

2.2 Стандартна бібліотека шаблонів С++

Крім типу string, мова С++ має декілька інших корисних доповнень. Ці доповнення об'єднані разом у стандартній бібліотеці шаблонів — Standard Template Library (STL). Ця бібліотека включає додаткові типи (вектори, множини, матриці і т.д.) і алгоритми (сортування, пошуку, виконання матричних операцій і т.д.). Як випливає із самої назви, STL — це родова бібліотека, і її типи та методи можуть застосовуватися до будь-якого базового типу. Наприклад, ви можете створити вектор цілих чисел, вектор символів, вектор, компонентами якого є числа з подвійною точністю або елементи типу, заданого користувачем.

Щоб продемонструвати використання бібліотеки STL, розглянемо приклад з векторами. Вектор, подібно масиву, являє собою упорядкований список елементів, до яких існують ефективні методи доступу. Однак вектор має значну перевагу в порівнянні з масивом, оскільки його розмірність автоматично збільшується при додаванні нових елементів. Щоб забезпечити можливість використання векторів, необхідно включити у свою програму заголовний файл <vector> і використовувати простір імен std.

#include <vector>

using namespace std;

Щоб створити цілочисельний вектор, необхідно оголосити його:

vector<int> i_vec;

Тут оголошена змінна i_vec, що являє собою порожній цілочисельний вектор (на це вказує <int>). Для додавання елементів до цього вектора використовується метод push_back():

i_vec.push_back(3); // поміщаємо 3 у кінець вектора

i_vec.push_back(1); // потім добавляємо 1

i_vec.push_back(2); // і, нарешті, 2

// тепер i_vec містить три елементи

// виведення вектора

for (int ix = 0; ix < i_vec.size(); ix++)

cout << i_vec[ix] << “ “;

// виводиться: 3 1 2

Подібно іншим типам, векторам можна присвоювати значення з використанням операції = і виконувати над ними операцію порівняння ==. Наприклад:

vector<int> vecA, vecB;

vecA.push_back(3); vecA.push_back(2);

vecB = vecA; // vecB = (3, 2)

vecB[1] = 0; // vecB = (3, 0)

if (vecA == vecB) cout << “Рівні!” << endl;

Операція == виконує поелементне порівняння двох векторів. У даному випадку вектори не рівні між собою.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: