C++. Бібліотека стандартних шаблонів STL. Загальні поняття

Бібліотека стандартних шаблонів STL (Standard Template Library). Загальні поняття. Контейнери. Алгоритми. Ітератори. Функтори

Дана тема є початком вивчення бібліотеки STL мови C++.


Зміст


Пошук на інших ресурсах:

1. Бібліотека STL. Загальні відомості

У мові C++ було розроблено потужний набір інструментів для створення різноманітних програм – бібліотеку стандартних шаблонів (Standard Template Library, STL). Ця бібліотека, фактично, є невід’ємною складовою мови C++, що є великим досягненням її розробників. Бібліотека STL включена в стандарт мови C++ і містить універсальні шаблонні класи та функції, які реалізують широкий спектр алгоритмів та структур даних. Ці засоби програмування можна застосовувати практично до будь-яких типів даних.

Розрізняють такі основні складові (компоненти) бібліотеки STL:

  • контейнери (container);
  • алгоритми (algorithm);
  • ітератори (iterator);
  • функціональні об’єкти або функтори (functor).

Використання та поєднання цих складових дозволяє програмувати розв’язки дуже широкого кола задач програмування.

 

2. Контейнери. Загальні відомості. Перелік

У програмуванні контейнер – це об’єкт, що зберігає інші об’єкти всередині себе. Об’єкти, що зберігаються в контейнерах, можуть бути як базових (примітивних) типів так і екземпляри класів з відповідним необхідним функціоналом.

У бібліотеці STL реалізовано наступні контейнери:

  • bitset – набір бітів;
  • deque – двохстороння черга;
  • list – лінійний список;
  • map – асоціативний контейнер, побудований за принципом key:value, в якому кожному ключу key відповідає значення value;
  • multimap – асоціативний контейнер, в якому одному значенню (key) відповідає декілька значень (value1, value2, …, valueN);
  • multiset – множина, в якій той самий елемент може зустрічатись декілька разів;
  • priority_queue – черга з пріоритетами;
  • queue – черга;
  • set – множина, в якій кожен елемент зустрічається тільки один раз;
  • stack – стек;
  • vector – динамічний масив.

 

3. Алгоритми. Загальні відомості

Вміст контейнерів обробляється з допомогою алгоритмів. Алгоритми дозволяють опрацьовувати контейнери на будь-який смак: ініціалізовувати, сортувати вміст контейнерів, перетворювати, реалізовувати різні види пошуку тощо.

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

#include <algorithm>

Усі алгоритми є шаблонними функціями. Вони можуть бути застосовані до будь-якого типу контейнера. Нижче наведено перелік алгоритмів бібліотеки STL:

  • adjacent_find – здійснює пошук пари сусідніх елементів, які співпадають між собою;
  • binary_search – виконує бінарний пошук в упорядкованій послідовності;
  • copy – копіює одну послідовність в іншу;
  • copy_backward – робить те саме що й copy, тільки результуюча послідовність записується у зворотньому порядку;
  • count – підраховує кількість входжень заданого елементу в послідовності;
  • count_if – обчислює кількість входжень елементу в послідовності, що відповідає заданій умові;
  • equal – визначає, чи співпадають елементи двох діапазонів;
  • equal_range – повертає діапазон, який допускає вставку елементів без порушення порядку;
  • fill, fill_n – заповнюють діапазон потрібними значеннями;
  • find – здійснює пошук елементу в заданій послідовності, повертає позицію (ітератор) першого входження елементу в послідовності;
  • find_end – здійснює пошук останнього входження підпослідовності, що міститься в заданому діапазоні;
  • find_first_of – виконує пошук першого елементу підпослідовності, що співпадає з будь-яким елементом іншої підпослідовності;
  • find_if – знаходить перший елемент послідовності, що співпадає з елементом з іншої послідовності;
  • for_each – застосовує задану функцію до заданого діапазону елементів;
  • generate, generate_n – присвоюють елементам діапазону значення, що повертаються функцією-генератором;
  • include – визначає, чи містить одна послідовність іншу;
  • inplace_merge – об’єднує два діапазони;
  • iter_swap – здійснює обмін місцями двох значень, на які вказують аргументи;
  • lexicographical_compare – здійснює лексикографічне порівняння двох послідовностей;
  • lower_bound – визначає перший елемент послідовності, який не менше заданого значення;
  • make_heap – на основі заданої послідовності створює “купу”;
  • max – повертає максимум з двох значень;
  • max_element – повертає позицію (ітератор), що встановлена на максимальний елемент послідовності;
  • merge – об’єднує дві впорядковані послідовності. Результат записується в третю послідовність;
  • min – з двох значень повертає мінімальне;
  • min_element – повертає позицію (ітератор), яка встановлена на мінімальний елемент послідовності;
  • mismatch – для двох заданих послідовностей знаходить перше неспівпадіння;
  • next_permutation – формує наступну перестановку елементів послідовності;
  • nth_element – впорядковує послідовність таким чином, що всі елементи, які менше заданого елементу, розміщуються перед цим елементом в послідовності;
  • partial_sort – виконує сортування елементів у заданому діапазоні;
  • partial_sort_copy – впорядковує елементи послідовності в заданому діапазоні, потім копіює в результуючу послідовність відсортовані елементи;
  • partition – впорядковує послідовність так, щоб всі елементи, які відповідають заданій умові, розміщувались перед всіма іншими елементами цієї послідовності;
  • pop_heap – міняє місцями перший та передостанній елементи та перебудовує “купу”;
  • prev_permutation – відтворює попередню перестановку, що складається з елементів послідовності;
  • push_heap – заштовхує елемент в кінець купи;
  • random_shuffle – змінює послідовність в заданому діапазоні;
  • remove – видаляє з вказаної послідовності елементи, які мають визначене значення;
  • remove_if – видаляє з вказаної послідовності елементи згідно заданого предикату;
  • remove_copy – копіює з вказаної послідовності елементи, що мають визначене значення, у задану послідовність;
  • remove_copy_if – копіює з вказаної послідовності елементи в іншу область на основі заданого предикату;
  • replace – замінює елементи заданого діапазону з одного значення на інше;
  • replace_if – замінює елементи заданого діапазону на основі предикату;
  • replace_copy_if – копіює елементи заданої послідовності в іншу область з заміною одного значення на інше;
  • replace_copy – копіює елементи заданого діапазону в іншу послідовність, замінюючи елементи на основі заданого предикату іншим значенням;
  • reverse – змінює порядок елементів послідовності на протилежний в межах заданого діапазону;
  • reverse_copy – змінює порядок елементів в послідовності на протилежни і результат записує в іншу послідовність;
  • rotate – виконує циклічний зсув вліво елементів послідовності в заданих межах;
  • rotate_copy – виконує циклічний зсув вліво елементів послідовності, результат поміщає в іншу послідовність;
  • search – виконує пошук підпослідовності в послідовності;
  • search_n – знаходить n-е входження заданого елемента в послідовності;
  • set_difference – для двох заданих послідовностей створює послідовність, що містить неспівпадаючі елементи (різниця множин);
  • set_intersection – для двох заданих послідовностей створює послідовність, що містить співпадаючі елементи (перетин множин);
  • set_symmetric_difference – створює послідовність, що є симетричною різницею двох послідовностей;
  • set_union – створює послідовність, що є об’єднанням двох послідовностей;
  • sort – впорядковує послідовність в заданому діапазоні;
  • sort_heap – впорядковує “купу” всередині заданого діапазону;
  • stable_partition – впорядковує послідовність в заданих межах таким чином, щоб всі елементи, які задовільняють заданій умові, передували всім іншим елементам. Розбиття послідовності фіксується;
  • stable_sort – впорядковує послідовність в заданих межах таким чином, що рівні елементи не змінюють свої місця;
  • swap – міняє місцями значення, що задані посиланнями;
  • swap_ranges – міняє місцями елементи заданого діапазону;
  • transform – для заданої послідовності виконує функцію до кожного елементу цієї послідовності. Результат зберігається в новій послідовності;
  • unique – витягує дублікати з вказаної послідовності;
  • unique_copy – робить копію з послідовності витягуючи з неї дублікати (однакові елементи);
  • upper_bound – знаходить останній елемент послідовності, що не перевищує задане значення.

 

4. Ітератори. Загальні відомості

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

Щоб використовувати ітератори потрібно підключити заголовок iterator

#include <iterator>

У C++ розрізняють 5 видів ітераторів:

  • RandIter – ітератор довільного доступу – записує та витягує значення з контейнеру. Забезпечує довільний доступ до елементів контейнера;
  • BiIter – двонаправлений ітератор – записує та витягує значення. Переміщується вперед і назад;
  • ForIter – прямий ітератор – переміщується тільки вперед. Записує та витягує значення;
  • InIter – ітератор вводу – тільки витягує значення. Переміщується тільки вперед;
  • OutIter – ітератор виводу – тільки записує значення. Переміщується тільки вперед.

В бібліотеці <iostream> визначено наступні класи, що реалізують ітератори:

  • iterator – базовий клас для всіх ітераторів;
  • iterator_traits – представляє різні типи, що визначені ітератором;
  • insert_iterator – забезпечує роботу ітераторів виводу, які вставляють об’єкти в контейнери;
  • back_insert_iterator – забезпечує роботу ітераторів виводу, які вставляють об’єкти в кінець контейнера;
  • front_insert_iterator – забезпечує роботу ітераторів виводу, які вставляють об’єкти на початок контейнера;
  • reverse_iterator – підтримує роботу зворотних ітераторів;
  • istream_iterator – підтримує роботу потокових ітераторів вводу;
  • istreambuf_iterator – підтримує роботу потокових ітераторів вводу символів;
  • ostream_iterator – підтримує роботу потокових ітераторів виводу;
  • ostreambuf_iterator – підтримує роботу потокових ітераторів виводу символів.

 

5. Функтори. Загальні відомості

Для забезпечення гнучкої взаємодії між ітераторами, контейнерами та алгоритмами, використовуються функтори. Функтор – це клас, в якому реалізована операторна функція operator(). Завдяки функторам об’єкт класу представляється як функція.

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

#include <functional>

У бібліотеці STL функтори поділяються на дві категорії:

  • бінарні – містять два аргументи;
  • унарні – містять один аргумент.

Бібліотека STL містить наступні бінарні функтори:

  • plus – додає (+) два аргументи;
  • minus – віднімає () аргументи;
  • multplies – множить (*) два аргументи;
  • divides – ділить (/) аргументи;
  • modulus – повертає результат операції % для двох аргументів;
  • equal_to – порівнює два аргументи на рівність (==);
  • not_equal_to – порівнює два аргументи на нерівність (!=);
  • greater – визначає, чи перший аргумент більше другого (>);
  • greater_equal – визначає, чи перший аргумент більше або рівне другого (>=);
  • less – визначає, чи перший аргумент менше другого (<);
  • less_equal – визначає, чи перший аргумент менше або рівне другого (<=);
  • logical_and – застосовує до аргументів логічне “I” (AND);
  • logical_or – застосовує до двох аргументів логічне “АБО” (OR).

Також визначені два унарні функтори:

  • logical_not – застосовує до аргументу логічне “НІ” (NOT);
  • negate – змінює знак свого аргументу на протилежний.

 


Споріднені теми