Справочник по стандартной библиотеке C++ (STL)
Программа на языке C++ может вызывать множество функций из этой реализации стандартной библиотеки C++. Эти функции выполняют такие службы, как входные и выходные данные, и обеспечивают эффективные реализации часто используемых операций.
Дополнительные сведения о связывании с соответствующим файлом среды выполнения .lib Visual C++ см. в разделах C Runtime (CRT) и C++ Standard Library (STL). .lib
Реализацию стандартной библиотеки C++ корпорации Майкрософт часто называют STL или стандартной библиотекой шаблонов. Хотя стандартная библиотека C++ является официальным названием библиотеки, как определено в ISO 14882, из-за популярного использования «STL» и «стандартной библиотеки шаблонов» в поисковых системах, мы иногда используем эти имена, чтобы упростить поиск нашей документации.
С исторической точки зрения , «STL» первоначально относится к стандартной библиотеке шаблонов, написанной Александром Степановым. Части этой библиотеки были стандартизированы в стандартной библиотеке C++, а также библиотеке среды выполнения ISO C, части библиотеки Boost и других функциональных возможностях. Иногда «STL» используется для ссылки на контейнеры и алгоритмы стандартной библиотеки C++, адаптированные на основе STL Стефанова. В этой документации стандартная библиотека шаблонов (STL) относится к стандартной библиотеке C++ в целом.
В этом разделе
Обзор стандартной библиотеки C++ Общие сведения о реализации стандартной библиотеки C++ корпорации Майкрософт.
iostream программирование Предоставляет общие сведения о программировании iostream .
Справочник по файлам заголовков Ссылки на справочные статьи о файлах заголовков стандартной библиотеки C++ с примерами кода.
Обзор стандартной библиотеки C++ (STL)
Все сущности библиотеки C++ объявляются или определяются в одном или нескольких стандартных заголовках. Эта реализация включает два других заголовка, и , которые не требуются стандартом C++. Полный список заголовков, поддерживаемых этой реализацией, см. в справочнике по файлам заголовков.
Стандарт C++ определяет два типа соответствующих библиотек:
- Размещенная реализация, которая поддерживает все необходимые заголовки стандартной библиотеки, описанные в стандарте ISO C++.
- Автономная реализация, для которой требуется только подмножество заголовков стандартной библиотеки. Необходимое подмножество:
Следующие заголовки являются устаревшими после C++11: , и .
Ниже перечислены другие различия между автономной и размещенной реализацией.
- Для размещенных реализаций требуется глобальная функция с именем main . Автономная реализация может определять собственные функции запуска и завершения.
- Размещенные реализации должны поддерживать несколько потоков, работающих одновременно. Разработчики автономных реализаций решают, поддерживает ли их библиотека параллельные потоки.
Стандартная библиотека Microsoft C++ удовлетворяет как требованиям к автономной среде, так и к размещению.
Заголовки библиотек C++ имеют два широких подраздела:
- соглашения iostreams.
- Справочные соглашения о стандартной библиотеке C++ (STL).
Этот раздел содержит следующие разделы:
- Использование заголовков библиотеки C++
- Соглашения о библиотеках C++
- Соглашения iostreams
- Запуск и завершение программ C++
- Безопасные библиотеки: стандартная библиотека C++
- Проверяемые итераторы
- Поддержка итераторов при отладке
- Справочник по стандартной библиотеке C++ (STL)
- Потокобезопасность в стандартной библиотеке C++
- Пространство имен stdext
- Регулярные выражения (C++)
Дополнительные сведения о библиотеках времени выполнения Visual C++ см. в разделе Функции библиотеки CRT.
Реализация стандартной библиотеки C++ корпорацией Майкрософт часто называется STL или стандартной библиотекой шаблонов. Хотя стандартная библиотека C++ является официальным названием библиотеки, как определено в ISO 14882, из-за популярного использования «STL» и «Стандартной библиотеки шаблонов» в поисковых системах, мы иногда используем эти имена, чтобы упростить поиск нашей документации. С исторической точки зрения , «STL» первоначально относится к стандартной библиотеке шаблонов, написанной Александром Степановым. Части этой библиотеки были стандартизированы в стандартной библиотеке C++, наряду с библиотекой времени выполнения ISO C, частями библиотеки Boost и другими функциями. Иногда «STL» также используется для обозначения контейнеров и алгоритмов стандартной библиотеки C++, адаптированных из STL Степанова. В этой документации стандартная библиотека шаблонов (STL) относится к стандартной библиотеке C++ в целом.
Основные понятия стандартной библиотеки С++
Данная статья определяет основные понятия стандартной библиотеки С++. Она приводится для того чтобы на неё ссылаться в дальнейшем.
Наибольшей частью стандартной библиотеки С++ является библиотека STL (Standard Template Library – Стандартная Библиотека Шаблонов). Библиотека STL содержит пять основных видов компонентов:
- контейнер (container): управляет набором объектов в памяти.
- итератор (iterator): обеспечивает для алгоритма средство доступа к содержимому контейнера.
- алгоритм (algorithm): определяет вычислительную процедуру.
- функциональный объект (function object): инкапсулирует функцию в объекте для использования другими компонентами.
- адаптер (adaptor): адаптирует компонент для обеспечения различного интерфейса.
Все компоненты удовлетворяют ряду требований, поэтому хорошо согласуются друг с другом.
Из определения контейнера следует, что любая пользовательская структура данных является контейнером. В нашем случае контейнеры есть стандартные структуры данных, такие как список (list), вектор (vector), словарь (map) и многие другие. Формальные требования к контейнерам довольно обширны, но основным является правило доступа к элементам. Доступ к элементам контейнера осуществляется через специальные объекты — итераторы (см. ниже). Вы можете не знать, как располагаются элементы контейнера в памяти, однако вы точно знаете, что итераторы можно перебрать последовательно, и каждый из них предоставит доступ к элементу. Итератор, указывающий на первый элемент, можно получить при помощи метода iterator begin(); контейнера. Итератор, указывающий за последний элемент, можно получить при помощи метода iterator end(); контейнера. Другими словами, итераторы располагаются в полуинтервале (или полуотрезке), что можно формально записать как [begin, end). Пример объявления контейнера:
struct a_container < struct an_iterator; an_iterator begin(); an_iterator end(); >;
В ожидаемом стандарте С++20 предложено использовать структуру, инкапсулирующую полуинтервалы — ranges
Итератор — объект, предоставляющий доступ к элементам контейнера и позволяющий их перебирать. Итератор является свойством контейнера. В первых реализациях стандартной библиотеки С++ итератор реализовывался как указатель на элемент контейнера. В современных реализациях это класс, инкапсулирующий указатель на объект контейнера.
Основные требования к итераторам — наличие операторов разыменования и инкремента. Ниже объявление контейнера с итератором.
template struct a_container < struct an_iterator < void operator++(); TYPE& operator*(); >; an_iterator begin(); an_iterator end(); >;
Я не могу дать лучшего определения алгоритма чем стандартное: алгоритмом называется последовательность действий, приводящая за конечное число шагов к необходимому результату.
В случае STL, алгоритмы реализуются шаблонными функциями, которые в качестве входных параметров принимают полуинтервалы итераторов. Общая сигнатура данных алгоритмов описывается следующим образом:
template RESULT an_algorithm(ITERATOR first, ITERATOR last, . );
В объявлении класса можно переопределить оператор (). Если этот оператор в классе переопределен, то объекты этого класса получают свойства функций (их можно использовать как функции). Такие объекты называются функциональными или функторами. Функторы удобно использовать, когда функция должна обладать «памятью», а также, как замена указателей на функции.
Начиная со стандарта С++11 существует возможность краткой записи функторов — лямбда-функции.
Каких-либо специальных требований к функторам нет. Разве что иногда может требоваться наследование от функтора function (до стандарта С++11 — unary_function или binary_function). Небольшой пример реализации функтора:
template struct plus < TYPE operator ()(const TYPE& p1, const TYPE& p2) const< return p1 + p2; >>;
Также STL предлагает ряд классов и функций (фукнторов), которые преобразуют интерфейс к нужному. В частности, есть адаптер stack, который на основе контейнеров реализует, соответственно, стэк. В качестве примера можно рассмотреть адаптер бинарной функции к унарной (на данный момент эта функция объявлена в стандарте С++ устаревшей):
template class bind1st < BIDIRECTIONAL_FUNCTION _bf; TYPE _first; public: bind1st(BIDIRECTIONAL_FUNCTION bf, TYPE first): _bf(bf), _first(first) <>TYPE operator()(const TYPE& p) const < return _bf(_first, p); >>;
Для самостоятельного чтения
- Драфт стандарта С++20 на гитхабе
- C++ Reference
- Разработка приложений на С++
- Range-v3, предложение для стандарта
При подготовке материала использовались источники:
https://learn.microsoft.com/ru-ru/cpp/standard-library/cpp-standard-library-reference?view=msvc-170
https://learn.microsoft.com/ru-ru/cpp/standard-library/cpp-standard-library-overview?view=msvc-170
https://habr.com/ru/articles/434986/