В языке программирования C++ стандартная библиотека C++ представляет собой набор классов и функций , которые написаны на основном языке и являются частью самого стандарта C++ ISO . [1]
Стандартная библиотека C++ предоставляет несколько универсальных контейнеров, функций для использования и управления этими контейнерами, объекты функций, универсальные строки и потоки (включая интерактивный и файловый ввод-вывод), поддержку некоторых языковых функций и функций для общих задач, таких как нахождение квадратного корня числа. Стандартная библиотека C++ также включает большинство заголовков стандартной библиотеки ISO C, заканчивающихся на ".h", но их использование было объявлено устаревшим (устаревание отменено с C++23 [2] ). [3] C++23 вместо этого считает эти заголовки полезными для взаимодействия с C , и не рекомендует их использовать вне программ, которые предназначены как для допустимых программ C и C++. Никакие другие заголовки в стандартной библиотеке C++ не заканчиваются на ".h". Функции стандартной библиотеки C++ объявлены в пространстве std
имен .
Стандартная библиотека C++ основана на соглашениях, введенных Стандартной библиотекой шаблонов (STL), и на нее оказали влияние исследования в области обобщенного программирования и разработчики STL, такие как Александр Степанов и Мэн Ли. [4] [5] Хотя Стандартная библиотека C++ и STL имеют много общих функций, ни одна из них не является строгим надмножеством другой. [ необходима ссылка ]
Примечательной особенностью стандартной библиотеки C++ является то, что она не только определяет синтаксис и семантику универсальных алгоритмов, но и предъявляет требования к их производительности. [6] Эти требования к производительности часто соответствуют известному алгоритму, который ожидается, но не является обязательным для использования. В большинстве случаев это требует линейного времени O( n ) или линейно-арифметического времени O( n log n ), но в некоторых случаях допускаются более высокие границы, такие как квазилинейное время O( n log 2 n ) для устойчивой сортировки (чтобы разрешить сортировку слиянием на месте ). Ранее сортировка требовала только O( n log n ) в среднем, что позволяло использовать быструю сортировку , которая быстра на практике, но имеет плохую производительность в худшем случае, но была введена introsort, чтобы обеспечить как быструю среднюю производительность, так и оптимальную сложность в худшем случае, и с C++11 сортировка гарантированно будет в худшем случае линейно-арифметической. В других случаях требования остаются более мягкими, например, для выбора , который должен быть линейным только в среднем (как в quickselect ), [7] не требуя линейности в худшем случае, как в introselect .
Стандартная библиотека C++ прошла стандартизацию ISO в рамках усилий по стандартизации C++ ISO в 1990-х годах. С 2011 года она расширялась и обновлялась каждые три года [8] с каждой редакцией стандарта C++.
Apache C++ Standard Library — еще одна реализация с открытым исходным кодом. Первоначально она была разработана в коммерческих целях компанией Rogue Wave Software , а затем передана в дар Apache Software Foundation . [9] Однако после более чем пяти лет без релиза совет Apache Software Foundation решил закрыть этот проект и перенести его в Apache Attic. [10]
Следующие библиотеки реализуют большую часть стандартной библиотеки C++:
С тех пор, как модули были введены в C++20 , поддержка стандартных библиотечных модулей отсутствовала до C++23 . Эти именованные модули были добавлены для включения всех элементов, объявленных как в глобальных, так и в std
пространствах имен, предоставляемых импортируемыми стандартными заголовками. Макросы не могут быть экспортируемыми, поэтому пользователи должны вручную включать или импортировать заголовки, которые выдают макросы для использования.
std
std
и глобальные функции выделения и освобождения памяти, предоставляемые импортируемыми заголовками библиотеки C++, включая средства библиотеки C (хотя они объявлены в стандартном пространстве имен).std.compat
std
, а также дополнительно экспортирует функции в глобальном пространстве имен в библиотеках C.Следующие файлы содержат объявления стандартной библиотеки C++.
<any>
std::any
.<atomic>
std::atomic
, несколько его специализаций шаблонов и больше атомарных операций.<chrono>
std::chrono::duration
, std::chrono::time_point
и часы. Начиная с C++20 , было добавлено огромное количество временных функций: календари, часовые пояса, больше часов и форматирование строк хроно.<concepts>
<expected>
std::expected
, тип результата .<functional>
<generator>
<memory>
std::unique_ptr
.<memory_resource>
<optional>
std::optional
, необязательный тип .<scoped_allocator>
std::scoped_allocator_adaptor
.<stacktrace>
<stdexcept>
std::logic_error
и std::runtime_error
, оба являются производными от std::exception
.<system_error>
std::error_code
<tuple>
std::tuple
, кортеж .<type_traits>
<utility>
std::pair
двух членов ), целочисленные последовательности времени компиляции, помощники в построении типов словаря, такие функции, как и и многое другое. Пространство имен для автоматической генерации операторов сравнения устарело в C++20 в пользу новых операторов сравнения по умолчанию.std::move
std::forward
std::rel_ops
<variant>
std::variant
, помеченный тип объединения .<compare>
<coroutine>
<exception>
std::exception
базовый класс всех исключений, выдаваемых стандартной библиотекой.<initializer_list>
<limits>
std::numeric_limits
, используемый для описания свойств основных числовых типов.<new>
new
и delete
другие функции и типы, составляющие основы управления памятью C++ .<source_location>
__LINE__
.<stdfloat>
<typeinfo>
<version>
<array>
std::array
, контейнер для массива фиксированного размера.<bitset>
std::bitset
— битовый массив .<deque>
std::deque
— двустороннюю очередь .<flat_map>
std::flat_map
и std::flat_multimap
.<flat_set>
std::flat_set
и std::flat_multiset
.<forward_list>
std::forward_list
, односвязный список .<list>
std::list
— двусвязный список .<map>
std::map
а std::multimap
также отсортированный ассоциативный массив и multimap .<mdspan>
std::mdspan
, аналогичный , std::span
но представление является многомерным.<queue>
std::queue
, одностороннюю очередь и std::priority_queue
приоритетную очередь .<set>
std::set
и std::multiset
отсортированные ассоциативные контейнеры или наборы .<span>
std::span
, не владеющее представление, которое ссылается на любой непрерывный диапазон.<stack>
std::stack
, стек .<unordered_map>
std::unordered_map
и хэш-std::unordered_multimap
таблицы .<unordered_set>
std::unordered_set
и std::unordered_multiset
.<vector>
std::vector
— динамический массив .<algorithm>
<execution>
<iterator>
<numeric>
<ranges>
<codecvt>
<locale>
<text_encoding>
<charconv>
<format>
std::format
.<string>
<string_view>
std::basic_string_view
, неизменяемое невладеющее представление для любой строки.<regex>
<filesystem>
<fstream>
<iomanip>
<ios>
<iosfwd>
<iostream>
<istream>
std::istream
и другие вспомогательные классы для ввода.<ostream>
std::ostream
и другие вспомогательные классы для вывода.<print>
std::print
поддерживаемые для потоков C и C++.<spanstream>
std::spanstream
и другие фиксированные буферы символов для потоков ввода-вывода.<sstream>
std::stringstream
и другие вспомогательные классы для работы со строками.<streambuf>
<syncstream>
std::osyncstream
и другие вспомогательные классы для синхронизированных выходных потоков.<barrier>
std::barrier
повторно используемый барьер потока.<condition_variable>
<future>
<hazard_pointer>
std::hazard_pointer
.<latch>
std::latch
одноразовый барьер потока.<mutex>
<rcu>
<shared_mutex>
<semaphore>
<stop_token>
<thread>
Компоненты, которые программы на C++ могут использовать для выполнения получисловых операций.
<bit>
<complex>
std::complex
и многочисленные функции для представления и обработки комплексных чисел.<numbers>
std::numbers
.<random>
<ratio>
<valarray>
std::valarray
, std::slice_array
, std::gslice_array
, std::mask_array
, и std::indirect_array
), два класса ( std::slice
и std::gslice
) и ряд связанных шаблонов функций для представления и манипулирования массивами значений.Каждый заголовок из стандартной библиотеки C включен в стандартную библиотеку C++ под другим именем, которое создается путем удаления .h и добавления 'c' в начале; например, 'time.h' становится 'ctime'. Единственное отличие между этими заголовками и традиционными заголовками стандартной библиотеки C заключается в том, что, где это возможно, функции должны быть помещены в std::
пространство имен. В ISO C функции в стандартной библиотеке разрешено реализовывать макросами , что не допускается в ISO C++.