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

програмне забезпечення

Стандартна бібліотека шаблонів (англ. Standard Template Library; STL) — бібліотека для C++, що містить набір узгоджених узагальнених алгоритмів, контейнерів, засобів доступу до їхнього вмісту і різних допоміжних функцій.

Стандартна бібліотека шаблонів до включення в стандарт C++ була сторонньою розробкою, на початку — фірми HP, а потім SGI. Стандарт мови не називає її «STL», оскільки ця бібліотека стала невід'ємною частиною мови, проте багато людей досі використовують цю назву, щоб відрізняти її від решти частини стандартної бібліотеки (потоки вводу/виводу (iostream), підрозділ Сі тощо).

Проект під назвою STLPort, заснований на SGI STL, здійснює постійне оновлення STL, IOstream і рядкових класів. Деякі інші проєкти також займаються розробкою приватних застосувань стандартної бібліотеки для різних конструкторських завдань. Кожен виробник компіляторів C++ обов'язково поставляє яку-небудь реалізацію цієї бібліотеки, оскільки вона є дуже важливою частиною стандарту і широко використовується.

Структура бібліотеки ред.

У бібліотеці виділяють чотири основні компоненти:

  1. Контейнер (container) — зберігання набору об'єктів в пам'яті.
  2. Ітератор (iterator) — забезпечення засобів послідовного доступу до вмісту контейнера.
  3. Алгоритм (algorithm) — визначення обчислювальної процедури.
  4. Функціональний об'єкт (functor) — заховання функції в об'єкті для використання іншими компонентами.

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

Контейнери ред.

Контейнери бібліотеки STL можна розділити на чотири категорії: послідовні, асоціативні, контейнери-адаптери і псевдоконтейнери.

КонтейнерОпис
Послідовні контейнери
vectorC-подібний динамічний масив довільного доступу з автоматичною зміною розміру при додаванні/видаленні елементу. Додавання-видалення елементу в кінець vector займає амортизоване час, та ж операція на початку або середині vector — . Існує спеціалізація шаблону vector для типу bool, яка вимагає менше пам'яті за рахунок зберігання bool у вигляді бітів.
listДвозв'язковий список, елементи якого зберігаються в довільних шматках пам'яті, на відміну від контейнера vector, де елементи зберігаються в безперервній області пам'яті. Повільний пошук і доступ за , в будь-якому місці швидка вставка і видалення за .
dequeСхожий на vector, але з можливістю швидкої вставки і видалення елементів на обох кінцях.
Асоціативні контейнери
setВпорядкована множина унікальних елементів. При вставці/видаленні елементів множини ітератори, що вказують на елементи цієї множини, не стають недійсними. Забезпечує стандартні операції над множиною типу об'єднання, перетину, віднімання. Тип елементів множини повинен реалізовувати оператора порівняння operator< або потрібно надати функцію-компаратор. Реалізований на основі самобалансуючого дерева двійкового пошуку.
multisetТе ж що і set, але дозволяє зберігати елементи, що повторюються.
mapВпорядкований асоціативний масив пар елементів, що складаються з ключів і відповідних ним значень. Ключі повинні бути унікальні. Порядок проходження елементів визначається ключами. При цьому тип ключа повинен реалізовувати оператора порівняння operator<, або потрібно надати функцію-компаратор.
multimapТе ж що і map, але дозволяє зберігати ключі, що повторюються.
Контейнери-адаптери
stackСтек — контейнер, в якому додавання і видалення елементів здійснюється з одного кінця.
queueЧерга — контейнер, з одного кінця якого можна додавати елементи, а з іншого — виймати.
priority_queueЧерга з пріоритетом, організована так, що найбільший елемент завжди стоїть на першому місці.
Псевдоконтейнери
bitsetСлужить для зберігання бітових масок. Схожий на vector<bool> фіксованого розміру. Розмір фіксується тоді, коли оголошується об'єкт bitset. Ітераторів в bitset немає. Оптимізований за розміром пам'яті.
basic_stringКонтейнер, призначений для зберігання і обробки рядків. Зберігає в пам'яті елементи підряд єдиним блоком, що дозволяє швидкий доступ до всієї послідовності.
valarrayШаблон служить для зберігання числових масивів і оптимізований для досягнення підвищеної обчислювальної продуктивності. Деякою мірою схожий на vector, але в нім відсутня більшість стандартних для контейнерів операцій. Проте, в ньому реалізовані операції, які можна ефективно реалізувати як на векторних процесорах, так і на скалярних процесорах з блоками SIMD.

У контейнерах для зберігання елементів використовується семантика передачі об'єктів за значенням. Іншими словами, при додаванні контейнер отримує копію елементу, і за запитом на витягання також повертає копію елементу. Присвоєння елементів реалізується за допомогою оператора присвоєння, а їхнє руйнування відбувається з використанням деструктора.

У таблиці наведено основні вимоги до елементів в контейнерах:

МетодОписПримітка
Конструктор копіїСтворює новий елемент, ідентичний старомуВикористовується при кожній вставці елементу в контейнер
Оператор присвоєнняЗамінює вміст елементу копією початкового елементуВикористовується при кожній модифікації елементу
ДеструкторРуйнує елементВикористовується при кожному видаленні елементу
Конструктор за умовчаннямСтворює елемент без аргументівЗастосовується тільки для певних операцій
operator==Порівнює два елементиВикористовується при виконанні operator== для двох контейнерів
operator<Визначає, чи менший один елемент за іншийВикористовується при виконанні operator< для двох контейнерів

Всі «повноцінні» стандартні контейнери задовольняють певному набору вимог (або угод). У наведеній нижче таблиці вважається, що С — клас контейнера, який містить об'єкти типу Т.

ВиразТип, що повертаєтьсяСкладністьПримітка
C::value_typeTЧас компіляції
C::referenceTЧас компіляції
C::const_referenceЧас компіляції
C::pointerТип вказівника, що вказує на C::referenceЧас компіляціїВказівник на Т
C::iteratorТип ітератора, що вказує на C::referenceЧас компіляціїІтератор будь-якого типу, окрім ітератора виводу
C::const_iteratorТип ітератора, що вказує на C::const_referenceЧас компіляціїІтератор будь-якого типу, окрім ітератора виводу
C::size_typeБеззнаковий цілочисельний типЧас компіляції
C obj;ПостійнаПісля: obj.size() == 0
C obj1; obj1 = obj2;ЛінійнаПісля: obj1 == obj2
C obj; (&obj)->~C();Результат не використовуєтьсяЛінійнаПісля: а.size() == 0.
obj.begin()Постійна
obj.end()Постійна
obj1 == obj2Оборотний в boolЛінійна
obj1 != obj2Оборотний в boolЛінійна
obj.size()size_typeПостійна
obj.empty()Оборотний в boolПостійна
obj1 < obj2Оборотний в boolЛінійна
obj1 > obj2Оборотний в boolЛінійна
obj1 <= obj2Оборотний в boolЛінійна
obj1 >= obj2Оборотний в boolЛінійна
obj.swap(obj2)voidПостійна

Ітератори ред.

У бібліотеці STL для доступу до елементів як посередник використовується узагальнена абстракція, що іменується ітератором. Кожен контейнер підтримує «свій» вид ітератора, який є «модернізованим» інтелектуальним вказівником, що «знає» як отримати доступ до елементів конкретного контейнера. Стандарт C визначає п'ять категорій ітераторів, описаних в наступній таблиці :

КатегоріяПідтримувані операціїПримітка
Вхідніoperator ++, operator *, operator ->, конструктор копії, operator =, operator ==, operator !=Забезпечують доступ для читання в одному напрямі. Дозволяють виконати присвоєння або копіювання за допомогою оператора присвоювання і конструктора копії
Вихідніoperator ++, operator*, конструктор копіїЗабезпечують доступ для запису в одному напрямі. Їх не можна порівнювати на рівність.
Однонаправленіoperator ++, operator *, operator ->, конструктор копії, конструктор за умовчанням, operator =, operator ==, operator !=Забезпечують доступ для читання і запису в одному напрямі. Дозволяють виконати присвоєння або копіювання за допомогою оператора присвоєння і конструктора копії. Їх можна порівнювати на рівність.
Двонаправленіoperator++, operator--, operator*, operator ->, конструктор копії, конструктор за умовчанням, operator =, operator ==, operator !=Підтримують усі функції, описані для однонаправлених ітераторів (дивись вище). Крім того, вони дозволяють переходити до попереднього елементу.
Довільного доступуoperator ++, operator --, operator *, operator ->, конструктор копії, конструктор за умовчанням, operator =, operator ==, operator !=, operator +, operator -, operator =, operator -=, operator <, operator >, operator <=, operator >=, operator []Еквівалентні звичайним вказівникам: підтримують арифметику вказівників, синтаксис індексації масивів і усі форми порівняння.

Посилання ред.


🔥 Top keywords: Головна сторінкаКоханівський Микола МиколайовичСпеціальна:ПошукВікіпедія:Культурна спадщина та видатні постаті (2024)Сухаревський Вадим ОлеговичСу-57Мустафа НайємФінал чемпіонату Європи з футболу 2016УкраїнаYouTubeНаціональна суспільна телерадіокомпанія УкраїниЧемпіонат Європи з футболу 2024Територіальний центр комплектування та соціальної підтримкиЧемпіонат Європи з футболу 201647-ма окрема механізована бригада (Україна)5-та окрема штурмова бригада (Україна)115-та окрема механізована бригада (Україна)Масі НайємМалавіВибори до Європейського парламенту 2024Спеціальна:Нові редагуванняВійськові звання УкраїниБріджертониМагучіх Ярослава ОлексіївнаЄрмак Андрій БорисовичРижівкаFacebookЗаворотнюк Анастасія ЮріївнаСексЧемпіонат Європи з легкої атлетики 2024СкуфОборонно-промисловий комплекс України10 червняКиївАльтернатива для НімеччиниЄвропейська народна партія (фракція)За межею (фільм, 2021)Військово-облікова спеціальністьС-300