Standard Template Library(STL), або стандартна бібліотека шаблонів, вплинула на архітектурна будова C++ і стала ядром мови. STL – це набір універсальних компонентів і сучасних високоефективних алгоритмів для управління даними. Завдяки цій C++ бібліотеці програмісту стали доступні передові досягнення в області структур даних і ефективних алгоритмів без необхідності детального осмислення їх будови і роботи.
C++ виходить на новий рівень
Для програміста STL представляється безліччю класів колекцій, призначених для визначених цілей, і набором алгоритмів, які можуть з ними працювати. Завдяки тому, що всі компоненти бібліотеки являють собою шаблони, їх можна використовувати для будь-яких типів елементів. Крім цього бібліотека дозволяє будувати власні класи і алгоритми, які зможуть працювати спільно з уже наявними.
Такий підхід до організації роботи з даними та алгоритмами виводить C + + на якісно інший рівень абстракції. Тепер програміст не обтяжений створенням динамічних масивів, списків, дерев, хешей. Також він може забути про програмування різних алгоритмів пошуку та обходу. З появою STL програмісту достатньо визначити відповідний контейнер і використовувати його функції-члени й алгоритми обробки. Компоненти STL здатні працювати з довільними типами даних. Це досягається тим, що всі компоненти C + + бібліотеки є шаблонами, що дозволяють використовувати будь-які типи, якщо вони здатні виконувати необхідні операції. Тобто контейнери та алгоритми узагальнені по відношенню до типів. Ця концепція називається узагальненим програмуванням.
Незважаючи на зміни, які були привнесені в C++ з появою STL, не варто забувати, що мова представляв собою ефективний і багатофункціональний інструмент програмування і до її появи, і всі свої риси C++ зберіг (наприклад, бібліотека system або ctime) і з появою STL лише примножив.
Компоненти бібліотеки
Будівельними блоками бібліотеки є ретельно структуровані компоненти та їх налагоджене взаємодія. Основними такими блоками є контейнери, ітератори і алгоритми. С++ бібліотека STL забезпечує дивовижний рівень гнучкості в програмуванні, але при цьому є складною для розуміння і вимогливою до часу освоєння.
Контейнери
У стандартної бібліотеки C++ контейнери застосовуються для управління колекціями і складаються з об'єктів певного типу. Всі контейнери володіють набором плюсів і мінусів. Тому розроблені різні контейнери, що підходять під різні вимоги, пропоновані програмами. Контейнери можуть представляти собою масиви або зв'язані списки. Вони також можуть бути реалізовані за допомогою спеціального ключа під кожен елемент. Існує 3 види контейнерів: Послідовні контейнери. Вони являють собою впорядковані колекції. У кожного елемента своя позиція, яка залежить від часу вставки і не залежить від значення елемента. Послідовних контейнерів 5 різновидів: array, vector, deque, list, forward list. Асоціативні контейнери. Це також впорядковані колекції елементів, однак їх позиція залежить від значення самого елемента або ключа, якщо елементами колекції є пара «ключ-значення». Існує 4 стандартних асоціативних контейнерів: set, multiset, map, multimap. Невпорядковані асоціативні контейнери. В даному випадку на порядок елементів в колекції не впливає ні значення, ні час вставки елемента в колекцію. Якщо вставити в таку колекцію n-ое кількість елементів, їх порядок буде непередбачуваний. Більш того, з плином часу він може змінюватися. Невпорядкованими контейнерами є: unordered set, unordered multiset, unordered map, unordered multimap.
Ітератори
Це механізми, які використовуються для обходу елементів в колекції об'єктів. При цьому колекціями можуть бути як контейнери, так і їх підмножину. Головним достоїнством ітераторів є те, що вони створюють мінімальний, достатній і універсальний інтерфейс для будь-якого типу контейнерів. Наприклад, одним із завдань ітераторів є переміщення елементів колекції і воно не залежить від структури цієї колекції, яка може бути чим завгодно: масив, дерево, хеш-таблиця. Перебір елементів працює однаково.
Інтерфейс самих ітераторів схожий на роботу з покажчиками. Наприклад, для отримання ітератором наступного елемента потрібно виконати операцію «++», а для отримання значення елемента, на який в даний момент вказує ітератор, – операцію «*». Таким чином, ітератор схожий на різновид інтелектуального покажчика.
Алгоритми
Основним завданням алгоритмів є обробка елементів колекцій. Наприклад, шукати або сортувати, змінювати або використовувати значення елемента. Алгоритми реалізуються за рахунок ітераторів. Такий підхід дозволяє створювати алгоритм тільки один раз і поширити його роботу на будь-контейнери завдяки єдиному інтерфейсу ітераторів. Для вкрай складних завдань розроблено механізм допоміжних функцій, що викликаються алгоритмами. Це забезпечує необхідну гнучкість для обробки специфічних випадків. Наприклад, програміст може задати особливий критерій пошуку. З появою лямбда-функцій з'явилися можливості для опису будь-яких операцій, що проводяться над елементами контейнерів при їх обминання. Таким чином бібліотека функцій C++ є дуже гнучкі можливості.
Суперечить STL концепцій ООП?
В С++ бібліотеки STL-дані управляються контейнерними класами, а операції – налаштованим алгоритмами. Виходить, що концепція бібліотеки STL розділяє дані та операції, що суперечить принципам об'єктно-орієнтованого програмування, які вимагають об'єднання даних і операцій. Однак цьому є виправдання. Завдяки взаємодії будь-яких алгоритмів з будь-якими контейнерами шляхом ітераторів програміст може об'єднати будь-які дані з будь-якими операціями. Таким чином, усувається суперечність з ООП і при цьому досягається абсолютно новий рівень гнучкості.
Висновок
STL являє собою новий або удосконалений підхід до програмування. Зачатки бібліотеки з'явилися давно. Перші ідеї зародилися в 1992-1994 роках. І після багаторічної розробки STL повністю увійшла до складу стандарту C++11. Бібліотека володіє великою функціональністю і відмінною гнучкістю, однак при цьому складна для розуміння. Її документація налічує сотні web-сторінок (наприклад, документація на сайті бібліотеки Microsoft Visual C++), а опис займає книги на 1000+ сторінок. При цьому бібліотека знаходиться в активній розробці.