Стандартна бібліотека шаблонів (англ. Standard Template Library; STL) — бібліотека для , що містить набір узгоджених узагальнених алгоритмів, контейнерів, засобів доступу до їхнього вмісту і різних допоміжних функцій.
Стандартна бібліотека шаблонів до включення в стандарт була сторонньою розробкою, на початку — фірми HP, а потім SGI. Стандарт мови не називає її «STL», оскільки ця бібліотека стала невід'ємною частиною мови, проте багато людей досі використовують цю назву, щоб відрізняти її від решти частини стандартної бібліотеки (потоки вводу/виводу (iostream), підрозділ Сі тощо).
Проект під назвою STLPort, заснований на SGI STL, здійснює постійне оновлення STL, IOstream і рядкових класів. Деякі інші проєкти також займаються розробкою приватних застосувань стандартної бібліотеки для різних конструкторських завдань. Кожен виробник компіляторів C++ обов'язково поставляє яку-небудь реалізацію цієї бібліотеки, оскільки вона є дуже важливою частиною стандарту і широко використовується.
Структура бібліотеки
У бібліотеці виділяють чотири основні компоненти:
- Контейнер (container) — зберігання набору об'єктів в пам'яті.
- Ітератор (iterator) — забезпечення засобів послідовного доступу до вмісту контейнера.
- Алгоритм (algorithm) — визначення обчислювальної процедури.
- Функціональний об'єкт (functor) — заховання функції в об'єкті для використання іншими компонентами.
Розділення дозволяє зменшити кількість компонентів. Наприклад, замість написання окремої функції пошуку елементу для кожного типу контейнера забезпечується єдина версія, яка працює з кожним з них, поки дотримуються основні вимоги.
Контейнери
Контейнери бібліотеки STL можна розділити на чотири категорії: послідовні, асоціативні, контейнери-адаптери і псевдоконтейнери.
Контейнер | Опис |
---|---|
Послідовні контейнери | |
vector | C-подібний динамічний масив довільного доступу з автоматичною зміною розміру при додаванні/видаленні елементу. Додавання-видалення елементу в кінець 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_type | T | Час компіляції | |
C::reference | T | Час компіляції | |
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 [] | Еквівалентні звичайним вказівникам: підтримують арифметику вказівників, синтаксис індексації масивів і усі форми порівняння. |
Посилання
- Довідник класів і методів SGI STL, сирці(англ.)
- STL по шагам(рос.) — статьи Артема Каева
- Основы C++. Библиотека STL(рос.) — архів розсилки
- (рос.) — докладне керівництво
- Использование STL в C++(рос.)
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U Vikipediyi ye statti pro inshi znachennya cogo termina STL Standartna biblioteka shabloniv angl Standard Template Library STL biblioteka dlya C sho mistit nabir uzgodzhenih uzagalnenih algoritmiv kontejneriv zasobiv dostupu do yihnogo vmistu i riznih dopomizhnih funkcij Standartna biblioteka shabloniv do vklyuchennya v standart C bula storonnoyu rozrobkoyu na pochatku firmi HP a potim SGI Standart movi ne nazivaye yiyi STL oskilki cya biblioteka stala nevid yemnoyu chastinoyu movi prote bagato lyudej dosi vikoristovuyut cyu nazvu shob vidriznyati yiyi vid reshti chastini standartnoyi biblioteki potoki vvodu vivodu iostream pidrozdil Si tosho Proekt pid nazvoyu STLPort zasnovanij na SGI STL zdijsnyuye postijne onovlennya STL IOstream i ryadkovih klasiv Deyaki inshi proyekti takozh zajmayutsya rozrobkoyu privatnih zastosuvan standartnoyi biblioteki dlya riznih konstruktorskih zavdan Kozhen virobnik kompilyatoriv C obov yazkovo postavlyaye yaku nebud realizaciyu ciyeyi biblioteki oskilki vona ye duzhe vazhlivoyu chastinoyu standartu i shiroko vikoristovuyetsya Struktura bibliotekiU biblioteci vidilyayut chotiri osnovni komponenti Kontejner container zberigannya naboru ob yektiv v pam yati Iterator iterator zabezpechennya zasobiv poslidovnogo dostupu do vmistu kontejnera Algoritm algorithm viznachennya obchislyuvalnoyi proceduri Funkcionalnij ob yekt functor zahovannya funkciyi v ob yekti dlya vikoristannya inshimi komponentami Rozdilennya dozvolyaye zmenshiti kilkist komponentiv Napriklad zamist napisannya okremoyi funkciyi poshuku elementu dlya kozhnogo tipu kontejnera zabezpechuyetsya yedina versiya yaka pracyuye z kozhnim z nih poki dotrimuyutsya osnovni vimogi KontejneriKontejneri biblioteki STL mozhna rozdiliti na chotiri kategoriyi poslidovni asociativni kontejneri adapteri i psevdokontejneri Kontejner Opis Poslidovni kontejneri vector C podibnij dinamichnij masiv dovilnogo dostupu z avtomatichnoyu zminoyu rozmiru pri dodavanni vidalenni elementu Dodavannya vidalennya elementu v kinec vector zajmaye amortizovane O 1 displaystyle O 1 chas ta zh operaciya na pochatku abo seredini vector O n displaystyle O n Isnuye specializaciya shablonu vector dlya tipu bool yaka vimagaye menshe pam yati za rahunok zberigannya bool u viglyadi bitiv list Dvozv yazkovij spisok elementi yakogo zberigayutsya v dovilnih shmatkah pam yati na vidminu vid kontejnera vector de elementi zberigayutsya v bezperervnij oblasti pam yati Povilnij poshuk i dostup za O n displaystyle O n v bud yakomu misci shvidka vstavka i vidalennya za O 1 displaystyle O 1 deque Shozhij na vector ale z mozhlivistyu shvidkoyi vstavki i vidalennya elementiv na oboh kincyah Asociativni kontejneri set Vporyadkovana mnozhina unikalnih elementiv Pri vstavci vidalenni elementiv mnozhini iteratori sho vkazuyut na elementi ciyeyi mnozhini ne stayut nedijsnimi Zabezpechuye standartni operaciyi nad mnozhinoyu tipu ob yednannya peretinu vidnimannya Tip elementiv mnozhini povinen realizovuvati operatora porivnyannya operator lt abo potribno nadati funkciyu komparator Realizovanij na osnovi samobalansuyuchogo dereva dvijkovogo poshuku multiset Te zh sho i set ale dozvolyaye zberigati elementi sho povtoryuyutsya map Vporyadkovanij asociativnij masiv par elementiv sho skladayutsya z klyuchiv i vidpovidnih nim znachen Klyuchi povinni buti unikalni Poryadok prohodzhennya elementiv viznachayetsya klyuchami Pri comu tip klyucha povinen realizovuvati operatora porivnyannya operator lt abo potribno nadati funkciyu komparator multimap Te zh sho i map ale dozvolyaye zberigati klyuchi sho povtoryuyutsya Kontejneri adapteri stack Stek kontejner v yakomu dodavannya i vidalennya elementiv zdijsnyuyetsya z odnogo kincya queue Cherga kontejner z odnogo kincya yakogo mozhna dodavati elementi a z inshogo vijmati priority queue Cherga z prioritetom organizovana tak sho najbilshij element zavzhdi stoyit na pershomu misci Psevdokontejneri bitset Sluzhit dlya zberigannya bitovih masok Shozhij na vector lt bool gt fiksovanogo rozmiru Rozmir fiksuyetsya todi koli ogoloshuyetsya ob yekt bitset Iteratoriv v bitset nemaye Optimizovanij za rozmirom pam yati basic string Kontejner priznachenij dlya zberigannya i obrobki ryadkiv Zberigaye v pam yati elementi pidryad yedinim blokom sho dozvolyaye shvidkij dostup do vsiyeyi poslidovnosti valarray Shablon sluzhit dlya zberigannya chislovih masiviv i optimizovanij dlya dosyagnennya pidvishenoyi obchislyuvalnoyi produktivnosti Deyakoyu miroyu shozhij na vector ale v nim vidsutnya bilshist standartnih dlya kontejneriv operacij Prote v nomu realizovani operaciyi yaki mozhna efektivno realizuvati yak na vektornih procesorah tak i na skalyarnih procesorah z blokami SIMD U kontejnerah dlya zberigannya elementiv vikoristovuyetsya semantika peredachi ob yektiv za znachennyam Inshimi slovami pri dodavanni kontejner otrimuye kopiyu elementu i za zapitom na vityagannya takozh povertaye kopiyu elementu Prisvoyennya elementiv realizuyetsya za dopomogoyu operatora prisvoyennya a yihnye rujnuvannya vidbuvayetsya z vikoristannyam destruktora U tablici navedeno osnovni vimogi do elementiv v kontejnerah Metod Opis Primitka Konstruktor kopiyi Stvoryuye novij element identichnij staromu Vikoristovuyetsya pri kozhnij vstavci elementu v kontejner Operator prisvoyennya Zaminyuye vmist elementu kopiyeyu pochatkovogo elementu Vikoristovuyetsya pri kozhnij modifikaciyi elementu Destruktor Rujnuye element Vikoristovuyetsya pri kozhnomu vidalenni elementu Konstruktor za umovchannyam Stvoryuye element bez argumentiv Zastosovuyetsya tilki dlya pevnih operacij operator Porivnyuye dva elementi Vikoristovuyetsya pri vikonanni operator dlya dvoh kontejneriv operator lt Viznachaye chi menshij odin element za inshij Vikoristovuyetsya pri vikonanni operator lt dlya dvoh kontejneriv Vsi povnocinni standartni kontejneri zadovolnyayut pevnomu naboru vimog abo ugod U navedenij nizhche tablici vvazhayetsya sho S klas kontejnera yakij mistit ob yekti tipu T Viraz Tip sho povertayetsya Skladnist Primitka C value type T Chas kompilyaciyi C reference T Chas kompilyaciyi C const reference Chas kompilyaciyi C pointer Tip vkazivnika sho vkazuye na C reference Chas kompilyaciyi Vkazivnik na T C iterator Tip iteratora sho vkazuye na C reference Chas kompilyaciyi Iterator bud yakogo tipu okrim iteratora vivodu C const iterator Tip iteratora sho vkazuye na C const reference Chas kompilyaciyi Iterator bud yakogo tipu okrim iteratora vivodu C size type Bezznakovij cilochiselnij tip Chas kompilyaciyi C obj Postijna Pislya obj size 0 C obj1 obj1 obj2 Linijna Pislya obj1 obj2 C obj amp obj gt C Rezultat ne vikoristovuyetsya Linijna Pislya a size 0 obj begin Postijna obj end Postijna obj1 obj2 Oborotnij v bool Linijna obj1 obj2 Oborotnij v bool Linijna obj size size type Postijna obj empty Oborotnij v bool Postijna obj1 lt obj2 Oborotnij v bool Linijna obj1 gt obj2 Oborotnij v bool Linijna obj1 lt obj2 Oborotnij v bool Linijna obj1 gt obj2 Oborotnij v bool Linijna obj swap obj2 void PostijnaIteratoriU biblioteci STL dlya dostupu do elementiv yak poserednik vikoristovuyetsya uzagalnena abstrakciya sho imenuyetsya Kozhen kontejner pidtrimuye svij vid iteratora yakij ye modernizovanim intelektualnim vkazivnikom sho znaye yak otrimati dostup do elementiv konkretnogo kontejnera Standart C viznachaye p yat kategorij iteratoriv opisanih v nastupnij tablici Kategoriya Pidtrimuvani operaciyi Primitka Vhidni operator operator operator gt konstruktor kopiyi operator operator operator Zabezpechuyut dostup dlya chitannya v odnomu napryami Dozvolyayut vikonati prisvoyennya abo kopiyuvannya za dopomogoyu operatora prisvoyuvannya i konstruktora kopiyi Vihidni operator operator konstruktor kopiyi Zabezpechuyut dostup dlya zapisu v odnomu napryami Yih ne mozhna porivnyuvati na rivnist Odnonapravleni operator operator operator gt konstruktor kopiyi konstruktor za umovchannyam operator operator operator Zabezpechuyut dostup dlya chitannya i zapisu v odnomu napryami Dozvolyayut vikonati prisvoyennya abo kopiyuvannya za dopomogoyu operatora prisvoyennya i konstruktora kopiyi Yih mozhna porivnyuvati na rivnist Dvonapravleni operator operator operator operator gt konstruktor kopiyi konstruktor za umovchannyam operator operator operator Pidtrimuyut usi funkciyi opisani dlya odnonapravlenih iteratoriv divis vishe Krim togo voni dozvolyayut perehoditi do poperednogo elementu Dovilnogo dostupu operator operator operator operator gt konstruktor kopiyi konstruktor za umovchannyam operator operator operator operator operator operator operator operator lt operator gt operator lt operator gt operator Ekvivalentni zvichajnim vkazivnikam pidtrimuyut arifmetiku vkazivnikiv sintaksis indeksaciyi masiviv i usi formi porivnyannya PosilannyaDovidnik klasiv i metodiv SGI STL sirci angl STL po shagam ros stati Artema Kaeva Osnovy C Biblioteka STL ros arhiv rozsilki ros dokladne kerivnictvo Ispolzovanie STL v C ros Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi