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

22.3.4. Доцільність використання ітераторів

Частково потужність бібліотеки STL зумовлена тим, що багато її функцій використовують ітератори. Цей факт дає змогу виконувати операції з двома контейнерами одночасно. Розглянемо, наприклад, такий формат векторної функції insert().

template <class InIter> void insert(iterator i, InIter start, InIter end);

Ця функція вставляє початкову послідовність, що визначається параметрами start і end, у приймальну послідовність, починаючи з позиції i. При цьому немає ніяких вимог, щоб ітератор i належав тому ж вектору, з яким пов'язані ітератори start і end. Таким чином, використовуючи цю версію функції insert(), можна один вектор вставити в іншій. Розглянемо такий приклад.

Код програми 22.5. Демонстрація механізму використання ітераторів для вставлення одного вектора у іншій

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

#include <vector> // Для роботи контейнерним класом "Вектор"

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

int main()

{

vector<char> vek, vek2; // Побудова векторів нульової довжини

unsigned int i;

// Поміщаємо значення у вектор.

for(i=0; i<10; i++) vek.push_back('A' + i);

// Відображаємо початковий вміст вектора.

cout << "Початковий вміст вектора:\n";

for(i=0; i<vek.size(); i++) cout << vek[i] << " ";

cout << endl << endl;

// Ініціалізуємо другий вектор.

char str[] = "-STL –– це сила!-";

for(i=0; str[i]; i++) vek2.push_back(str[i]);

/* Отримуємо ітератори для середини вектора vek,

а також початку і кінця вектора vek2. */

vector<char>::iterator p = vek.begin()+5;

vector<char>::iterator p2start = vek2.begin();

vector<char>::iterator p2end = vek2.end();

// Вставляємо вектор vek2 у вектор vek.

vek.insert(p, p2.start, p2.end);

// Відображаємо результат вставки.

cout << "Вміст вектора vek після вставки:\n";

for(i=0; i<vek.size(); i++) cout << vek[i] << " ";

cout << endl;

getch(); return 0;

}

У процесі виконання ця програма відображає такі результати:

Початковий вміст вектора:

A B C D E F G H I J

Вміст вектора vek після вставки:

A B C D E – S T L - - ц е c и л а ! – F G Н I J

Як бачите, вміст вектора vek2 поміщено у середину вектора vek.

У міру подальшого вивчення можливостей, що надаються STL, можна дізнатися, що| ітератори є зв'язними засобами, які роблять бібліотеку єдиним цілим. Вони дають змогу виконувати дії з двома (і більше) об'єктами STL одночасно, але особливо корисні під час використання алгоритмів, описаних нижче у цьому розділі.

22.4. Робота зі списками

Клас list підтримує функціонування двоспрямованого лінійного списку. На відміну від вектора, у якому реалізовано підтримку довільного доступу, список дає змогу отримувати до своїх елементів тільки послідовний доступ. Двоспрямованість списку означає, що доступ до його елементів можливий у двох напрямах: від початку до кінця і від кінця до початку.

Список – це контейнер з двоспрямованим послідовним доступом до його елементів.

Шаблонна специфікація класу list має такий вигляд.

template <class myType, class Allocator = allocator<myType> class list

У цьому записі myType – тип даних, що зберігаються у списку, а елемент Allocator означає розподільник пам'яті, який за замовчуванням використовує стандартний розподільник. У класі list визначено такі конструктори:

explicit list(const Allocator &a = Allocator());

explicit list(size_type num|, const myType &val = myType (),

const Allocator &a = Allocator());

list(const list<myType, Allocator> &ob);

template <class InIter>list(InIter start, InIter end,

const Allocator &a = Allocator());

Конструктор, який представлено у першій формі, створює порожній список. Друга форма призначена для створення списку, який містить num елементів із значенням val. Третя створює список, який містить ті самі елементи, що і об'єкт ob. Четверта створює список, який містить елементи у діапазоні, заданому параметрами start і end.

Для класу list визначено такі оператори порівняння: ==, <, <=, !=, > і >=.