STL (Standard Template Library) — стандартная библиотека шаблонов C++
STL — это часть стандартной библиотеки C++, предоставляющая набор готовых шаблонов (template) для работы с контейнерами, алгоритмами, итераторами и функциями. Это основа современного C++, позволяющая писать эффективный и универсальный код.
🔥 Основные компоненты STL
1. Контейнеры (Containers)
Хранят данные разных типов. Делятся на:
- Последовательные:
vector
— динамический массив (быстрый доступ по индексу).list
— двусвязный список (быстрая вставка/удаление).deque
— двусторонняя очередь.- Ассоциативные:
set
/multiset
— уникальные/неуникальные элементы (автосортировка).map
/multimap
— словарь (ключ → значение).- Неупорядоченные (хеш-таблицы):
unordered_set
,unordered_map
(быстрый поиск, но без сортировки).- Адаптеры:
stack
(LIFO),queue
(FIFO),priority_queue
(с приоритетом).
2. Алгоритмы (Algorithms)
- Немодифицирующие:
find
,count
,for_each
. - Модифицирующие:
sort
,reverse
,transform
. - Численные:
accumulate
,inner_product
.
3. Итераторы (Iterators)
- Связывают алгоритмы и контейнеры.
- Типы:
input
,output
,forward
,bidirectional
,random_access
.
4. Функциональные объекты (Functors) и Лямбды
std::function
,std::bind
, лямбда-выражения ([](){}
).
5. Умные указатели (Smart Pointers)
unique_ptr
(эксклюзивное владение),shared_ptr
(с подсчётом ссылок),weak_ptr
.
⚡ Примеры кода
1. Работа с vector
и алгоритмами
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums = {5, 2, 8, 1, 9};
std::sort(nums.begin(), nums.end()); // Сортировка
for (int num : nums) {
std::cout << num << " "; // 1 2 5 8 9
}
}
2. Использование map
#include <map>
#include <string>
std::map<std::string, int> ages = {{"Alice", 25}, {"Bob", 30}};
ages["Charlie"] = 28; // Добавление элемента
3. Лямбда-функции и for_each
std::vector<int> nums = {1, 2, 3};
std::for_each(nums.begin(), nums.end(), [](int n) {
std::cout << n * 2 << " "; // 2 4 6
});
4. Умные указатели
#include <memory>
auto ptr = std::make_unique<int>(42); // unique_ptr
auto sharedPtr = std::make_shared<int>(100); // shared_ptr
📊 Плюсы и минусы STL
✅ Преимущества
✔ Стандартизированность — часть C++, нет зависимостей.
✔ Эффективность — оптимизированные алгоритмы (например, sort
быстрее qsort
).
✔ Универсальность — подходит для любых проектов.
❌ Недостатки
❌ Сложность для новичков (шаблоны, итераторы).
❌ Ограниченная функциональность — для специфичных задач нужны Boost или сторонние библиотеки.
❌ Нет потокобезопасности (требует ручной синхронизации).
🚀 STL vs. Вручную написанные структуры
Критерий | STL | Ручная реализация |
---|---|---|
Скорость | Оптимизирована компилятором | Зависит от навыков |
Безопасность | Проверена годами | Риск ошибок |
Гибкость | Общие решения | Можно сделать под задачу |
🔥 Продвинутые возможности
- Move-семантика (
std::move
). - STL-алгоритмы с параллельностью (C++17,
std::execution::par
). - Контейнеры с аллокаторами (кастомное управление памятью).
🛠 Как использовать?
- Подключите нужные заголовки:
#include <vector>
#include <algorithm>
- Используйте
std::
пространство имён. - Для C++20:
<ranges>
,<format>
.
💡 Советы
- Используйте
emplace_back
вместоpush_back
для контейнеров. - Предпочитайте
std::array
вместо «сырых» массивов. - Для C++20:
<span>
для работы с непрерывными данными.
🚀 Вывод
STL — это «база» C++, которую должен знать каждый разработчик. Она:
✔ Ускоряет разработку.
✔ Снижает количество ошибок.
✔ Обеспечивает переносимость кода.
Что изучать дальше?
- Boost (расширенная STL).
- C++20/23 (
ranges
,coroutines
). - Оптимизация работы с контейнерами.