В чем разница между STL и Стандартной библиотекой C++?
Краткий ответ: STL — это историческое ядро, а Стандартная библиотека — это всё вместе
Давайте сразу расставим точки над i. STL (Standard Template Library) — это конкретная библиотека шаблонов, разработанная Александром Степановым и его коллегами в лаборатории HP в 1994 году. Она была предложена комитету по стандартизации C++ и стала частью Стандартной библиотеки C++. Стандартная библиотека C++ — это гораздо более широкое понятие, которое включает в себя STL, а также множество других компонентов (потоки ввода-вывода, строки, исключения, память и т.д.).
Изначально STL состояла из трех ключевых компонентов:
- Контейнеры (Containers):
vector,list,deque,set,mapи т.д. - Итераторы (Iterators): обобщенные указатели для навигации по контейнерам.
- Алгоритмы (Algorithms):
sort,find,copy,transformи т.д., работающие через итераторы.
Позже в STL добавили адаптеры (stack, queue) и функциональные объекты (functors), но основа осталась прежней.
Что входит в Стандартную библиотеку, но не входит в STL?
Вот список вещей, которые не являются STL, хотя и входят в std:::
- Потоки ввода-вывода:
<iostream>,<fstream>,<sstream>— это библиотека IOStream, разработанная отдельно от STL. - Строки:
std::string(хотя она похожа на контейнер, исторически она не часть STL). - Умные указатели:
std::unique_ptr,std::shared_ptr(добавлены в C++11). - Многопоточность:
std::thread,std::mutex(C++11). - Регулярные выражения:
std::regex(C++11). - Случайные числа:
<random>. - Время:
<chrono>. - Исключения:
std::exception,<stdexcept>.
Почему возникла путаница?
Путаница возникла по трем причинам:
- Историческая инерция: Когда STL только появилась, это была революция. Программисты говорили "я использую STL" вместо "я использую стандартную библиотеку". Термин прижился.
- Маркетинг: Книги вроде "Effective STL" Скотта Мейерса и "The C++ Standard Library" Николая Йоссутиса часто используют термин STL как синоним для шаблонной части библиотеки.
- Неформальное общение: В разговоре проще сказать "STL" вместо "шаблонная часть Стандартной библиотеки C++".
Практический пример: где проходит граница?
Посмотрите на этот код:
#include <iostream> // НЕ STL (IOStream)
#include <vector> // STL (контейнер)
#include <algorithm> // STL (алгоритм)
#include <string> // НЕ STL (но часто путают)
#include <memory> // НЕ STL (умные указатели)
int main() {
std::vector<int> v = {1, 2, 3}; // STL
std::sort(v.begin(), v.end()); // STL
std::string s = "hello"; // НЕ STL
std::cout << s << std::endl; // НЕ STL
auto ptr = std::make_unique<int>(42); // НЕ STL
return 0;
}
Как видите, в одном файле могут соседствовать STL и не-STL компоненты. С точки зрения компилятора разницы нет — всё это часть std::. Но с исторической точки зрения STL — это только контейнеры, итераторы и алгоритмы.
Современный взгляд
Начиная с C++11, термин "STL" официально считается устаревшим в контексте стандарта. Комитет по стандартизации использует термин "Стандартная библиотека C++". Однако в сообществе разработчиков STL живёт как удобное сокращение. Главное — помнить: STL — это подмножество Стандартной библиотеки, а не её синоним.
Если вы хотите быть технически точным — говорите "Стандартная библиотека". Если общаетесь с коллегами и все понимают контекст — можете говорить "STL", имея в виду шаблонные контейнеры и алгоритмы.
<<Дополнение: почему это важно знать новичку?
Понимание разницы между STL и Стандартной библиотекой помогает избежать двух распространённых ошибок:
- Не путайте "STL" с "std". Когда вы пишете
#include <iostream>, вы не подключаете STL. А когда пишете#include <vector>— подключаете. Это знание пригодится, если вы читаете старые книги или статьи, где авторы говорят "STL не поддерживает потоки" — они правы, потому что потоки не входили в оригинальную STL. - Понимание архитектуры STL помогает писать обобщённый код. STL строится на концепции "разделения контейнеров и алгоритмов через итераторы". Это фундаментальный принцип, который не работает с
std::iostreamилиstd::stringтак же элегантно. Например, вы не можете применитьstd::sortк потоку напрямую — для этого нужно скопировать данные в контейнер.
Совет: Если вы слышите "STL" в современном контексте, скорее всего, говорят именно о контейнерах, итераторах и алгоритмах. Всё остальное (потоки, строки, потоки, умные указатели) лучше называть "компонентами Стандартной библиотеки". Это сделает ваше общение с опытными разработчиками более точным.