Стандартна бібліотека шаблонів stl (4 години)

Константний ітератор (значення елементів змінювати заборонено)

Посилання на елемент

Тип ключа (для асоціативних контейнерів)

Тип критерію порівняння (для асоціативних контейнерів)

У табл. 2 представлені деякі загальні для всіх контейнерів операції.

Таблиця 2. Операції та методи, загальні для всіх контейнерів

Операція або метод

Операції рівності (==) та нерівності (!=)

Повертають значення true чи false

Копіює один контейнер в інший

Видаляє всі елементи

Додає один елемент або діапазон елементів

Видаляє один елемент або діапазон елементів

size_type size() const

Повертає кількість елементів

size_type max_size() const

Повертає максимально допустимий розмір контейнера

bool empty0 const

Повертає true, якщо контейнер порожній

Повертають ітератор на початок контейнера (ітерації будуть проводитись у прямому напрямку)

Повертають ітератор на кінець контейнера (ітерації у напрямі будуть закінчені)

Повертають реверсивний ітератор на кінець контейнера (ітерації будуть проводитись у зворотному напрямку)

Повертають реверсивний ітератор на початок контейнера (ітерації у зворотному напрямку будуть закінчені

5. Використання послідовних контейнерів

До основних послідовних контейнерів відносятьсявектор(vector),список(list) тадвостороння черга(deque).

Щоб використовувати послідовний контейнер, потрібно включити до програми відповідний файл заголовка:

using namespace std;

Контейнервекторє аналогом звичайного масиву, за винятком того, що він автоматично виділяє та звільняє пам'ять у мірунеобхідності. Контейнер ефективно опрацьовує довільну вибірку елементів за допомогою операції індексації [] або методу at. Однак вставка елемента у будь-яку позицію, крім кінця вектора, є неефективною. Для цього потрібно зрушити всі наступні елементи шляхом копіювання їх значень. З цієї причини неефективним є видалення будь-якого елемента, крім останнього.

Контейнерсписокорганізує зберігання об'єктів як двозв'язного списку. Кожен елемент списку містить три поля: значення елемента, вказівник на попередній та вказівник на наступний елемент списку. Вставка та видалення працюють ефективно для будь-якої позиції елемента у списку. Однак, список не підтримує довільного доступу до своїх елементів: наприклад, для вибірки n-го елемента потрібно послідовно вибрати попередні п-1 елементів.

Контейнердвостороння чергабагато в чому аналогічний вектору, елементи зберігаються в безперервній області пам'яті. Але на відміну від вектора двостороння черга ефективно підтримує вставку та видалення першого елемента (так само, як і останнього).

Існує п'ять способів визначити об'єкт для послідовного контейнера.

1. Створити порожній контейнер:

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

3. Створити контейнер заданого розміру та ініціалізувати його елементи зазначеним значенням:

vector vecl(100, 0); deque decl(300, 0.0);

4. Створити контейнер та ініціалізувати його елементи значеннями діапазону (first, last) елементів іншого контейнера:

int arr[7] = (15, 2, 19, -3, 28, 6, 8);

vector vl(arr, arr + 7);

list lst(vl.beg() + 2, vl.end());

5. Створити контейнер та ініціалізувати його елементи значеннямиелементів іншого однотипного контейнера:

// додати елементи vl

Таблиця 3. Методи, що підтримують послідовні контейнери

додавання в кінець

додавання в кінець

додавання в кінець

видалення з кінця

видалення з кінця

видалення з кінця

Вставка у довільне місце

додавання на початок

додавання на початок

видалення з довільного місця

видалення з початку

видалення з початку

доступ до довільного елементу

Вставка у довільне місце

Вставка у довільне місце

видалення з довільного місця

видалення з довільного місця

доступ до довільного елементу

Метод insert має наступні реалізації:

iterator insert(iterator pos, const T&key); // Вставляє елемент key в позицію, яку вказує ітератор pos, повертає ітератор на вставлений елемент

void insert(iterator pos, size_type n, const T&key); // вставляє n елементів key починаючи з позиції, на яку вказує ітератор pos

void insert(iterator pos, InputIter first, InputIter last);// вставляє елементи діапазону first..last, починаючи з позиції, яку вказує ітератор pos

for( i=0;i ::iterator iv=v1.erase(v1.begin());

cout ::iterator iv=v1.erase(v1.begin()+1,v1.begin()+5);

Як видалити останній елемент?

vector ::iterator iv=v1.erase(v1.end()-1);

3) Ще один приклад роботи з векторами, що демонструє використання методів swap(), empty(), back(), pop_back():

Метод swap(v) служить обміну елементів одного типу, але з обов'язково одного розміру: v1.swap(v2);

back() – отримати доступ до останнього елементу

using namespace std;

// Ініціалізація вектора масивом

int n = sizeof(arr)/sizeof(double);

vector vl(arr, arr + n);

vector v2; // Порожній вектор

vl.swap(v2); // обміняти вміст vl та v2

T:: iterator p=C.begin();

//#1 створити об'єкт-контейнер типу deque

print("The first queue:\n",q);

list::iterator i;

1 100 2 3 4 5 100 0

Спеціалізовані послідовні контейнери – стек, черга та черга з пріоритетами – не є самостійними контейнерними класами, а реалізовані на основі розглянутих вище класів, тому вони називаються адаптерами контейнерів.

За промовчанням длястекапрототипом є клас deque.

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

Методи класу stack: push(); pop(); top(); empty(); size ().

Шаблонний класqueue(заголовний файл ) є адаптером, який може бути реалізований на основі двосторонньої черги (за замовчуванням) або списку. Клас vector як клас-прототип не підходить, оскільки в ньому немає вибірки з початку контейнера. Черга використовує для проштовхування даних один кінець, а виштовхування — інший.

Методи класу queue: push(); pop(); front(); back(); empty (); size().

Шаблонний клас priority_queue (заголовний файл) підтримує такі ж операції, як і клас queue, але реалізація класу можлива або на основі вектора (за замовчуванням), або на основі списку.Черга з пріоритетами відрізняється від звичайної черги тим, що для вилучення вибирається максимальний елемент зі збережених у контейнері. Тому після кожної зміни стану черги максимальний елемент, що залишилися, зрушується на початок контейнера.

Методи класу priority_queue: queue: push(); pop(); front(); back(); empty (); size().