Стандартная библиотека C++ (STL): полный обзор
Стандартная библиотека C++ (часто называемая STL — Standard Template Library) — это мощный набор шаблонных классов и функций, который является неотъемлемой частью любого компилятора C++. Она предоставляет разработчику готовые, проверенные и высокоэффективные решения для большинства повседневных задач: от работы с коллекциями данных до сложных алгоритмов и ввода-вывода. Изучение STL — ключевой шаг в освоении современного C++.
В этой статье мы подробно разберем основные компоненты стандартной библиотеки, их назначение и приведем практические примеры использования.
1. Контейнеры (Containers)
Контейнеры — это структуры данных, предназначенные для хранения коллекций объектов. Все контейнеры являются шаблонными классами, что позволяет хранить элементы любого типа.
- Последовательные контейнеры: хранят элементы в линейном порядке.
std::vector— динамический массив. Быстрый доступ по индексу, вставка/удаление в конце — O(1), в середине — O(n).std::list— двусвязный список. Быстрая вставка/удаление в любом месте, но нет прямого доступа по индексу.std::deque— двусторонняя очередь. Быстрая вставка/удаление как в начале, так и в конце.std::array— статический массив фиксированного размера (C++11).
- Ассоциативные контейнеры: хранят элементы в отсортированном порядке (обычно на основе красно-черных деревьев).
std::set— множество уникальных элементов.std::map— словарь (ассоциативный массив) пар "ключ-значение".std::multiset/std::multimap— аналоги, допускающие дубликаты.
- Неупорядоченные ассоциативные контейнеры (C++11): используют хеш-таблицы.
std::unordered_set,std::unordered_map— быстрый доступ в среднем за O(1).
- Адаптеры контейнеров: предоставляют ограниченный интерфейс на основе другого контейнера.
std::stack(LIFO),std::queue(FIFO),std::priority_queue(с приоритетом).
Пример использования std::vector:
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {10, 20, 30, 40, 50};
numbers.push_back(60); // Добавляем элемент в конец
for (int n : numbers) {
std::cout << n << " ";
}
// Вывод: 10 20 30 40 50 60
return 0;
}
2. Итераторы (Iterators)
Итераторы — это обобщенные указатели, которые позволяют перебирать элементы любого контейнера единообразным способом. Они являются связующим звеном между контейнерами и алгоритмами.
- Категории итераторов: Input, Output, Forward, Bidirectional, Random Access.
begin()/end()— возвращают итераторы на первый и последний+1 элемент.std::advance()— перемещает итератор на N позиций.std::distance()— вычисляет расстояние между двумя итераторами.
Пример с итераторами:
#include <iostream>
#include <vector>
int main() {
std::vector<std::string> words = {"Hello", "World", "C++"};
for (auto it = words.begin(); it != words.end(); ++it) {
std::cout << *it << " ";
}
// Вывод: Hello World C++
return 0;
}
3. Алгоритмы (Algorithms)
Библиотека <algorithm> содержит более 100 шаблонных функций, реализующих различные операции над диапазонами данных. Алгоритмы работают с итераторами, что делает их универсальными.
- Поиск:
std::find,std::binary_search