Введение

Сборник классов и функций, используемых в языке программирования C++

В языке программирования C++, стандартная библиотека — это набор классов и функций, написанных на основном языке и являющихся частью стандарта ISO C++.

Обзор

Стандартная библиотека C++ предоставляет несколько обобщённых контейнеров, функции для использования и манипулирования этими контейнерами, функциональные объекты, обобщённые строки и потоки (включая интерактивный и файловый ввод-вывод), поддержку некоторых возможностей языка и функции для общих задач, таких как вычисление квадратного корня числа. Стандартная библиотека C++ также включает в себя большинство заголовочных файлов стандартной библиотеки ISO C, заканчивающихся на ".h", но их использование было объявлено устаревшим (отмена устаревания произошла в C++23). C++23 рассматривает эти заголовочные файлы как полезные для взаимодействия с C и не рекомендует их использование вне программ, предназначенных для компиляции как в C, так и в C++. Другие заголовочные файлы в стандартной библиотеке C++ не заканчиваются на ".h". Функции стандартной библиотеки C++ объявляются в пространстве имён `std`. Стандартная библиотека C++ основана на соглашениях, представленных Стандартной библиотекой шаблонов (STL), и сформировалась под влиянием исследований в области обобщённого программирования и разработчиков STL, таких как Александр Степанов и Менг Ли. Хотя стандартная библиотека C++ и STL имеют много общих черт, ни одна из них не является строгим надмножеством другой. Важной особенностью стандартной библиотеки C++ является то, что она определяет не только синтаксис и семантику обобщённых алгоритмов, но и предъявляет требования к их производительности. Эти требования к производительности часто соответствуют известному алгоритму, который предполагается, но не обязательно использовать. В большинстве случаев требуется линейное время O(n) или линеаритмическое время O(n log n), но в некоторых случаях допускаются более высокие границы, например, квазилинейное время O(n log² n) для стабильной сортировки (чтобы разрешить сортировку на месте). Ранее для сортировки требовалось только O(n log n) в среднем случае, что позволяло использовать быструю сортировку, которая эффективна на практике, но имеет плохую производительность в худшем случае. Однако была введена интроспективная сортировка (introsort), обеспечивающая как высокую среднюю производительность, так и оптимальную сложность в худшем случае, и начиная с C++11, сортировка гарантированно имеет сложность не более линеаритмической в худшем случае. В других случаях требования остаются менее строгими, например, для выбора (selection), который в среднем случае должен выполняться за линейное время (как в quickselect), без требования линейного времени в худшем случае, как в introselect. Стандартная библиотека C++ прошла стандартизацию ISO в рамках усилий по стандартизации C++ ISO в 1990-х годах. С 2011 года она расширяется и обновляется каждые три года с каждой новой редакцией стандарта C++.

Реализация

Наименование Организация Домашняя страница Акроним Лицензия Последний выпуск GNU C++ Стандартная библиотека Проект GNU и Фонд свободного программного обеспечения libstdc++ GPLv3 с исключением GCC Runtime Library Новый основной релиз раз в год LLVM C++ Стандартная библиотека LLVM Группа разработчиков libc++ Apache License 2.0 с исключениями LLVM Каждые 2 недели NVIDIA C++ Стандартная библиотека Nvidia libcu++ Apache License 2.0 с исключениями LLVM 2022 10 12 Microsoft C++ Стандартная библиотека Microsoft MSVC STL Apache License 2.0 с исключениями LLVM Ежедневно HPX C++ Стандартная библиотека для параллелизма и конкурентности STELLAR Group HPX Boost Software License 1.0 2022 08 06 Стандартная библиотека шаблонов Electronic Arts Electronic Arts EASTL BSD 3-Clause License 2021 10 20 Dinkum C++ Библиотека Dinkumware Неизвестная Коммерческая Неизвестный Cray C++ Стандартная библиотека Cray User Group Неизвестная Коммерческая Неизвестная

Стандартная библиотека Apache C++

Стандартная библиотека Apache C++ – ещё одна реализация с открытым исходным кодом. Изначально она была разработана компанией Rogue Wave Software в коммерческих целях, а затем передана в дар Apache Software Foundation. Однако, после более чем пяти лет без выпуска релизов, совет директоров Apache Software Foundation принял решение завершить этот проект и переместить его в Apache Attic.

Стандартные модули

С тех пор, как модули были введены в C++20, поддержка стандартных библиотечных модулей отсутствовала до C++23. Эти именованные модули были добавлены для включения всех элементов, объявленных как в глобальном, так и в пространстве имен `std`, предоставляемых импортируемыми стандартными заголовками. Макросы нельзя экспортировать, поэтому пользователям необходимо вручную включать или импортировать заголовки, которые определяют макросы для использования. Экспортирует все объявления в пространстве имен `std` и глобальные функции выделения и освобождения памяти, предоставляемые импортируемыми заголовками стандартной библиотеки C++, включая средства библиотеки C (хотя они объявлены в стандартном пространстве имен). Экспортирует те же объявления, что и именованный модуль `std`, и дополнительно экспортирует функции в глобальном пространстве имен из средств библиотеки C.

Стандартные заголовки

Следующие файлы содержат объявления стандартной библиотеки C++.

Общий

Новое в C++17. Предоставляет класс с удалением типа std::any. Новое в C++11. Предоставляет шаблон класса std::atomic, несколько его специализаций шаблонов и дополнительные атомарные операции. Предоставляет элементы времени, такие как std::chrono::duration, std::chrono::time_point и часы. Начиная с C++20, добавлено значительное количество функций для работы со временем: календари, часовые пояса, дополнительные часы и форматирование времени в виде строк. Новое в C++20. Предоставляет фундаментальные концепции библиотеки. Новое в C++23. Предоставляет шаблон класса std::expected, представляющий тип результата. Предоставляет несколько функторных объектов, предназначенных для использования со стандартными алгоритмами. Новое в C++23. Предоставляет генератор корутин, который дополнительно поддерживает операции вложенного возврата значений для диапазонов. Предоставляет средства управления памятью в C++, включая шаблон класса std::unique_ptr. Новое в C++17. Предоставляет средства для создания полиморфных распределителей памяти, поведение которых может изменяться во время выполнения. Новое в C++17. Предоставляет шаблон класса std::optional, представляющий необязательный тип. Новое в C++11. Предоставляет адаптер распределителя std::scoped_allocator. Новое в C++23. Предоставляет операции трассировки стека вызовов. Содержит стандартные классы исключений, такие как std::logic_error и std::runtime_error, оба производные от std::exception. Новое в C++11. Определяет std::error_code. Новое в C++11 и TR1. Предоставляет шаблон класса std::tuple, кортеж. Новое в C++11. Предоставляет средства метапрограммирования для работы с типами. Предоставляет различные утилиты: шаблон класса std::pair (кортеж из двух элементов), последовательности целых чисел времени компиляции, вспомогательные средства для построения типов словарного запаса, функции, такие как std::move и std::forward, и многое другое. Пространство имен std::rel_ops для автоматической генерации операторов сравнения устарело в C++20 в пользу новых операторов сравнения по умолчанию. Новое в C++17. Предоставляет шаблон класса std::variant, тип объединения с тегами.

Языковая поддержка

Новое в C++20. Обеспечивает поддержку оператора трёхстороннего сравнения. Новое в C++20. Обеспечивает поддержку сопрограмм. Предоставляет несколько типов и функций, связанных с обработкой исключений, включая std::exception, базовый класс всех исключений, выбрасываемых Стандартной библиотекой. Новое в C++11. Обеспечивает поддержку списков инициализации. Предоставляет шаблон класса std::numeric_limits, используемый для описания свойств фундаментальных числовых типов. Предоставляет операторы new и delete, а также другие функции и типы, составляющие основу управления памятью в C++. Новое в C++20. Обеспечивает захват информации об исходном местоположении в качестве альтернативы предопределённым макросам, таким как LINE. Новое в C++23. Обеспечивает условную поддержку расширенных типов с плавающей точкой. Предоставляет средства для работы с информацией о типах во время выполнения C++. Новое в C++20. Предоставляет информацию о реализации стандартной библиотеки C++.

Контейнеры

Новое в C++11 и TR1. Предоставляет шаблон класса контейнера `std::array`, контейнер для массива фиксированного размера. Предоставляет специализированный контейнерный класс `std::bitset`, битовый массив. Предоставляет шаблон класса контейнера `std::deque`, двусторонняя очередь. Новое в C++23. Предоставляет шаблоны класса адаптера контейнера `std::flat_map` и `std::flat_multimap`. Новое в C++23. Предоставляет шаблоны класса адаптера контейнера `std::flat_set` и `std::flat_multiset`. Новое в C++11 и TR1. Предоставляет шаблон класса контейнера `std::forward_list`, односвязный список. Предоставляет шаблон класса контейнера `std::list`, двусвязный список. Предоставляет шаблоны класса контейнера `std::map` и `std::multimap`, отсортированный ассоциативный массив и мультимап. Новое в C++23. Предоставляет шаблон класса `std::mdspan`, аналогичный `std::span`, но представление многомерное. Предоставляет классы контейнерных адаптеров `std::queue`, одноконцевая очередь, и `std::priority_queue`, очередь с приоритетом. Предоставляет шаблоны класса контейнеров `std::set` и `std::multiset`, отсортированные ассоциативные контейнеры или множества. Новое в C++20. Предоставляет шаблон класса `std::span`, невладеющее представление, ссылающееся на любой непрерывный диапазон. Предоставляет контейнер адаптера класса `std::stack`, стек. Новое в C++11 и TR1. Предоставляет шаблон класса контейнера `std::unordered_map` и `std::unordered_multimap`, хэш-таблицы. Новое в C++11 и TR1. Предоставляет шаблон класса контейнера `std::unordered_set` и `std::unordered_multiset`. Предоставляет шаблон класса контейнера `std::vector`, динамический массив.

Итераторы и диапазоны

Предоставляет определения множества алгоритмов для работы с контейнерами и другими диапазонами. Новое в C++17. Предоставляет политики выполнения для параллельных алгоритмов. Предоставляет классы и шаблоны для работы с итераторами. Обобщенные численные алгоритмы. Новое в C++20. Предоставляет средства работы с диапазонами и адаптеры с ленивыми вычислениями.

Локализация

Предоставляет средства преобразования кодировок символов для различных кодировок. Этот заголовок устарел, начиная с C++17. Определяет классы и объявляет функции, инкапсулирующие и обрабатывающие информацию, специфичную для локали. Добавлено в C++26. Предоставляет средства идентификации кодировок текста.

Струнки

Новое в C++17. Предоставляет независимые от локали, не выделяющие память и не генерирующие исключения утилиты для преобразования строк в целые числа и числа с плавающей точкой, и обратно. Новое в C++20. Предоставляет современный способ форматирования строк, включая `std::format`. Предоставляет стандартные классы и шаблоны строк C++. Новое в C++17. Предоставляет шаблон класса `std::basic_string_view` – неизменяемый, не владеющий представлением любой строки. Новое в C++11. Предоставляет утилиты для сопоставления строк с образцами с использованием регулярных выражений.

Потоки, файлы и вход/выход

Новое в C++17. Предоставляет средства для операций с файловой системой и её компонентами. Предоставляет средства для ввода и вывода данных на основе файлов. См. `fstream`. Предоставляет средства для управления форматированием вывода, такие как основание, используемое при форматировании целых чисел, и точность значений с плавающей точкой. Предоставляет несколько типов и функций, базовых для работы с потоками ввода-вывода (iostreams). Предоставляет предварительные объявления нескольких шаблонов классов, связанных с операциями ввода-вывода. Обеспечивает базовые принципы ввода и вывода в C++. См. `iostream`. Предоставляет `std::istream` и другие вспомогательные классы для ввода. Предоставляет `std::ostream` и другие вспомогательные классы для вывода. Новое в C++23. Предоставляет утилиты форматированного вывода, такие как `std::print`, поддерживаемые как для потоков C, так и для C++. Новое в C++23. Предоставляет `std::spanstream` и другие потоки ввода-вывода с фиксированным буфером символов. Предоставляет `std::stringstream` и другие вспомогательные классы для манипулирования строками. Обеспечивает функциональность чтения и записи в/из определенных типов последовательностей символов, таких как внешние файлы или строки. Новое в C++20. Предоставляет `std::osyncstream` и другие вспомогательные классы для синхронизированных потоков вывода.

Библиотека поддержки потоков

Новое в C++20. Предоставляет std::barrier, многоразовый барьер для потоков. Новое в C++11. В 32.6 1 переменные условия обеспечивают примитивы синхронизации, используемые для блокировки потока до тех пор, пока другой поток не уведомит о выполнении определенного условия или пока не будет достигнуто системное время. Новое в C++11. В 32.9.1 1 в этом разделе описываются компоненты, которые программа на C++ может использовать для получения в одном потоке результата (значения или исключения) из функции, выполненной в том же или другом потоке. Новое в C++26. Предоставляет указатель std::hazard. Новое в C++20. Предоставляет std::latch, одноразовый барьер для потоков. Новое в C++11. В 32.5 1 в этом разделе представлены механизмы взаимного исключения: мьютексы, блокировки и вызов один раз. Новое в C++26. Предоставляет механизмы обновления при чтении копии. Новое в C++14. Предоставляет средства для совместного мьютекса. Новое в C++20. Предоставляет семафор, моделирующий неотрицательный счетчик ресурсов. Новое в C++20. В 32.3.1 1 в этом разделе описываются компоненты, которые можно использовать для асинхронного запроса на своевременную остановку выполнения операции, обычно потому, что результат больше не требуется. Такой запрос называется запросом на остановку. Новое в C++11. Предоставляет класс и пространство имен для работы с потоками.

Библиотека чисел

Компоненты, которые программы на C++ могут использовать для выполнения операций, связанных с числами. Добавлено в C++20. Предоставляет средства для работы с битами. Определяет шаблон класса `std::complex` и множество функций для представления и манипулирования комплексными числами. Добавлено в C++20. Предоставляет математические константы, определенные в пространстве имен `std::numbers`. Добавлено в C++11. Средства для генерации (псевдо)случайных чисел и распределений. Добавлено в C++11. Предоставляет арифметику рациональных чисел во время компиляции, основанную на шаблонах классов. Определяет пять шаблонов классов (`std::valarray`, `std::slice_array`, `std::gslice_array`, `std::mask_array` и `std::indirect_array`), два класса (`std::slice` и `std::gslice`) и ряд связанных шаблонов функций для представления и манипулирования массивами значений.

Стандартная библиотека C

Каждый заголовочный файл из стандартной библиотеки C включен в стандартную библиотеку C++ под другим именем, которое генерируется удалением 'h' и добавлением 'c' в начало; например, 'time.h' становится 'ctime'. Единственное различие между этими заголовочными файлами и традиционными заголовочными файлами стандартной библиотеки C заключается в том, что, по возможности, функции помещаются в пространство имен std::. В ISO C функции стандартной библиотеки могут быть реализованы с помощью макросов, что запрещено в ISO C++.