Avatar ·

В чем разница между STL и Стандартной библиотекой C++?

Привет, коллеги! Я начинающий C++ разработчик и постоянно сталкиваюсь с терминами "STL" и "Стандартная библиотека C++". Вроде бы все их используют как синонимы, но я чувствую, что это не совсем одно и то же. Например, я пишу такой код: ```cpp #include #include #include int main() { std::vector numbers = {3, 1, 4, 1, 5, 9}; std::sort(numbers.begin(), numbers.end()); for (int n : numbers) { std::cout << n << " "; } return 0; } ``` Здесь я использую `` и `` — это я привык называть STL. Но ведь `` и `std::cout` тоже часть стандартной библиотеки. Получается, что STL — это просто часть стандартной библиотеки? Или это разные вещи? В интернете куча споров: одни говорят, что STL умерла, другие — что это основа C++. Мне нужно четкое понимание: что именно считать STL, а что — Стандартной библиотекой? И почему вообще возникла эта путаница? Буду благодарен за развернутый ответ с примерами. <<>>

Краткий ответ: 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>.

Почему возникла путаница?

Путаница возникла по трем причинам:

  1. Историческая инерция: Когда STL только появилась, это была революция. Программисты говорили "я использую STL" вместо "я использую стандартную библиотеку". Термин прижился.
  2. Маркетинг: Книги вроде "Effective STL" Скотта Мейерса и "The C++ Standard Library" Николая Йоссутиса часто используют термин STL как синоним для шаблонной части библиотеки.
  3. Неформальное общение: В разговоре проще сказать "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 и Стандартной библиотекой помогает избежать двух распространённых ошибок:

  1. Не путайте "STL" с "std". Когда вы пишете #include <iostream>, вы не подключаете STL. А когда пишете #include <vector> — подключаете. Это знание пригодится, если вы читаете старые книги или статьи, где авторы говорят "STL не поддерживает потоки" — они правы, потому что потоки не входили в оригинальную STL.
  2. Понимание архитектуры STL помогает писать обобщённый код. STL строится на концепции "разделения контейнеров и алгоритмов через итераторы". Это фундаментальный принцип, который не работает с std::iostream или std::string так же элегантно. Например, вы не можете применить std::sort к потоку напрямую — для этого нужно скопировать данные в контейнер.

Совет: Если вы слышите "STL" в современном контексте, скорее всего, говорят именно о контейнерах, итераторах и алгоритмах. Всё остальное (потоки, строки, потоки, умные указатели) лучше называть "компонентами Стандартной библиотеки". Это сделает ваше общение с опытными разработчиками более точным.