Стандартна бібліотека шаблонів 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().