§15 Стандартная библиотека языка C++ (STD).

Стандартная библиотека C++ (STD)

В языке программирования C++ термин Стандартная Библиотека (далее – STD) означает коллекцию классов и функций для решения различных задач. STD и ядро языка C++ развивались и стандартизировались параллельно. В следствие этого, многие важные вещи, например ввод/вывод, не являются частью ядра, а принадлежат STD. Все компоненты STD согласованы друг с другом, но основаны на разных принципах проектирования. В основу разработки библиотеки положена парадигма обобщенного программирования. Все классы библиотеки – это шаблоны. Средства стандартной библиотеки объявляются как входящие в пространство имён std. Стандартная библиотека С++ включает в себя часть стандартной библиотеки языка C. Стандарт C++17 содержит нормативную ссылку на стандарт C11 и не определяет самостоятельно те функции стандартной библиотеки, которые заимствуются из стандартной библиотеки C.
Доступ к возможностям STD C++ обеспечивается с помощью включения в программу соответствующих стандартных заголовочных файлов. Всего в стандарте C++20 определено 108 таких файлов. STD содержит следующие разделы:

  • Concepts library
  • Coroutines library
  • Utilities library
  • Dynamic memory management
  • Numeric limits
  • Error handling
  • Strings library
  • Containers library
  • Iterators library
  • Ranges library
  • Algorithms library
  • Numerics library
  • Input/output library
  • Localization library
  • Regular Expressions library
  • Atomic Operations library
  • Thread support library
  • Filesystem library
Заметим, что компиляторы не поддерживают на 100% компоненты STD последних стандартов. Если говорить о GCC, то разработчики включают некоторые возможности STD до выхода стандарта, а некоторые заявленные в текущем стандарте вещи остаются не реализованными. Например, тип char8_t поддерживается с 9 версии GCC, т. е. раньше, чем вышел стандарт в котором он был заявлен (C++20). Или Concepts library уже обрела поддержку в GCC-10, но не реализована в компиляторе Clang (на начало лета 2020 г.). Modules (входящие в библиотеку утилит) в GCC не реализованы, но частично поддерживаются Clang и т. д. Получить более детальные сведения о поддержке стандартов C++ в GCC можно на этих сайтах: C++ Standards Support in GCC и C++ compiler support. Поэтому, прежде чем включать тот или иной компонент STD в свою программу, убедитесь о его поддержке используемым компилятором. В данном курсе используются только поддерживаемые компоненты в компиляторе GCC 10 стандарта C++17.
Каждый заголовочный файл из стандартной библиотеки языка Си включен в STD C++ под именами, начинающиеся префиксом 'c', например, ctime, .
По правилам языка C++ соответствующий компонент STD добавляется в программу путем включения заголовочного файла с помощью директивы:

#include <имя_файла>

при этом обычное “расширение” в имени заголовочных файлов (".h") отбрасывается.

Ранее мы уже акцентировали ваше внимание на том, что полной совместимости между языками C и C++ не существует. В современном стандарте языка C++ появилось много вещей, которые не будут работать в языке Си, равно как и многие вещи принятые в Си перестали работать в С++. Например:

typedef int name;        // В С++ не работает
char array[4] = "abcd";  // В С++ не работает 
char* p = "abc";         // В С++ не работает
sizeof(A) == sizeof(int) // работает в C, но не в С++
sizeof(A) == sizeof(e)   // работает в C ++, но не в С
void f() {
    auto int x;          // в С++ не работает
}
static struct S {
    int i;               // в С++ не работает
};

В языке Си не существуют классы динамических контейнеров, которые освобождают память в автоматическом режиме. Динамические массивы в Си нужно создавать “вручную” с помощью библиотечных функций malloc, free и realloc. (В C++ поддерживаются функции работы с памятью из стандартной библиотеки Си, но их использование не рекомендуется). В продолжении нашего курса мы практически не обращаемся к библиотеке языка Си (за исключением cmath и ctime).

Компоненты STL

Контейнеры, строки, алгоритмы, итераторы и основные утилиты, за исключением заимствований из библиотеки C, собирательно называются STL (Standard Template Libraryстандартная шаблонная библиотека). STL, до включения в стандарт C++, была сторонней разработкой, в начале — фирмы HP, а затем SGI. Стандарт языка не называет её STL, так как эта библиотека стала неотъемлемой частью языка (и, следовательно, STD). Но в некоторых источниках до сих пор фигурирует эта аббревиатура, чтобы отличать STL от остальной части STD, подчеркивая, её некую обособленность и независимость. Но это не соответствует действительности и выглядит чересчур архаично. Обобщенная парадигма распространилась и на остальные части STD, первоначально не входившие в STL. Архитектуру STL разработали Александр Степанов и Менг Ли. STL вошла в стандартную библиотеку C++ весной 1994 года. В названии “STL” отражено то, что для реализации средств общего вида (контейнеров, строк, алгоритмов) использованы механизмы обобщённого программирования.
В целом, STL состоит из двух основных частей: классы контейнеров и алгоритмы для работы с элементами контейнеров. Все компоненты STL являются шаблонами, поэтому их можно использовать для произвольных типов элементов, включая абстрактные. Со многими компонентами STL мы уже смогли познакомиться и научиться ими использовать при решении различных задач. Ниже приводятся ссылки на внутренние ресурсы сайта, где проводится детальный разбор соответствующего компонента.

В STL выделяют пять основных компонентов:

Контейнеры

Обобщим наши знания о контейнерах. Контейнеры — это специализированные классы, предназначенные для хранения коллекции однотипных объектов и обеспечения доступа к этим объектам. Контейнер – это структура данных похожая на массив. Контейнер управляет выделяемой для его элементов памятью и предоставляет функции-члены для доступа к ним, либо непосредственно, либо через итераторы. Конструкторы контейнеров имеют дополнительный специальный аргумент allocator (распределитель). Аллокатор инкапсулирует (т. е. скрывает) реализацию выделения и освобождения памяти. Аллокатором по умолчанию является шаблон std::allocator (если не определен пользовательский распределитель). В качестве инструментов выделения и освобождения памяти этот аллокатор использует стандартные операции new и delete. Для различных контейнеров имеются как общие, так и специфичные операции, применимые только для данного вида коллекции объектов. Разные контейнеры обеспечивают различную эффективность тех или иных операций. Выбор оптимального контейнера для конкретного случая зависит не только от предоставляемой функциональности, но и от его эффективности при различных рабочих нагрузках. Контейнеры подразделяются на следующие виды:

Последовательные контейнеры

В последовательных контейнерах элементы располагаются последовательно, один за другим. Позиция зависит от времени и места вставки, но не связана со значением элемента. Каждый элемент контейнера имеет свой индекс (за исключением контейнера list); как и в массивах, отсчет начинается с "0". Но, в отличие от C-массивов, имеющих фиксированный размер, последовательные контейнеры – динамические массивы (за исключением контейнера array). К последовательным контейнерам относятся классы:

Контейнер array предоставляет максимальную эффективность при работе с массивом фиксированного размера. Контейнер vector ведет себя как array, но может автоматически увеличиваться по мере необходимости (является динамическим массивом, как и все остальные контейнеры, кроме array). vector позволяет осуществлять быструю вставку и удаление в конце массива, в то время как контейнер deque с обоих концов. Но эффективность доступа к элементам у вектора выше, чем у дека. Контейнер list предоставляет эффективную вставку элементов в любой позиции, но не поддерживает произвольный доступ к элементам.

Ассоциативные контейнеры

Ассоциативные контейнеры реализуют упорядоченные структуры данных с возможностью быстрого поиска. Достигается это автоматической сортировкой элементов (по умолчанию – по возрастанию) и принципиально иным способом внутреннего представления данных, основанного на сбалансированном бинарном дереве. К ассоциативным контейнерам относятся:

Класс set (множество) представляет собой упорядоченный контейнер, соответствующий математическому понятию множества. set хранит упорядоченное множество уникальных ключей (или просто – значений).
Класс map (словарь) реализует упорядоченный ассоциативный массив пар элементов, состоящих из уникальных ключей и соответствующих им значений. Контейнеры multiset и multimap допускают существование нескольких ключей с одинаковым значением.
Помимо упорядоченных ассоциативных контейнеров, имеются неупорядоченные структуры данных (хеш-массивы) с возможностью быстрого поиска:

  • unordered_set
  • unordered_map
  • unordered_multiset
  • unordered_multimap
Контейнеры-адаптеры

Контейнеры-адаптеры (container adaptor) — это обёртки над другими контейнерами, предоставляющие особые наборы операций. Оборачиваемый контейнер может быть задан как дополнительный параметр шаблона. Если параметр не задан, будет использоваться, специфический для адаптера, контейнер по умолчанию. К контейнерам-адаптерам относятся:

Контейнер stack (стек) реализует структуру данных в которой элементы добавляются и удаляются в вершине стека (т. е. с одного конца). Массив элементов, организован по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»). Контейнер queue (очередь) реализует структуру данных в которой добавление элемента возможно только в конец очереди, а выборка — из начала очереди, при этом выбранный элемент из очереди удаляется.
Контейнер priority_queue (очередь с приоритетами) поддерживает операции, аналогичные классу stack, но вставка элементов предполагает их неявную сортировку, так что операция извлечения элемента извлекает всегда минимальный (или максимальный, если определена соответствующая функция сравнения) элемент коллекции.

Псевдо-контейнеры

Подведем черту упоминанием еще одного типа контейнеров – псевдо-контейнеров. Это особый вид контейнеров, которые созданы для специфичных элементов на основе каркаса для проектирования новых контейнеров, предоставляемого библиотекой стандартных шаблонов. К псевдо-контейнерам относятся:

Независимые библиотеки для C++

Помимо STD, различными компаниями разрабатываются и сторонние библиотеки. Многие из них приобрели большую популярность и активно используются разработчиками ПО. Среди них можно выделить следующие:

  • Boost — собрание библиотек классов, использующих функциональность языка C++ и предоставляющих удобный, кроссплатформенный, высокоуровневый интерфейс для решения различных повседневных подзадач программирования (работа с данными, алгоритмами, файлами, потоками и т.п.). Свободно распространяются по лицензии Boost Software License вместе с исходным кодом. Разработанные ранее проектом Boost библиотеки позднее вошли в состав языка C++ Сайт
  • Qt – кроссплатформенный фреймворк. Комплектуется собственной IDE – Qt Creator, который, помимо редактора кода, интегрирует все основные компоненты Qt: визуальную среду разработки графического интерфейса Qt Designer, Qt Linguist — графическую утилиту, позволяющую упростить локализацию и перевод программы, Qt Assistant — справочную систему Qt, упрощающую работу с документацией по библиотеке, а также позволяющую создавать кроссплатформенную справку. Qt Creator использует GCC или Microsoft VC++ в качестве компилятора и GDB в качестве отладчика. Сайт
  • wxWidgets — это кроссплатформенная библиотека инструментов с открытым исходным кодом для разработки кроссплатформенных приложений. Основным применением wxWidgets является построение графического интерфейса пользователя (GUI), однако библиотека включает большое количество других функций и используется для создания весьма разнообразного ПО. Сайт
  • GTK — кроссплатформенная библиотека элементов интерфейса (фреймворк), имеет простой в использовании API, наряду с Qt является одной из двух наиболее популярных на сегодняшний день библиотек для X Window System. (Написана на Си, но имеет свой официальный интерфейс для C++). Сайт
  • Cairo — это программная библиотека для отрисовки векторной графики с открытым исходным кодом. Включает в себя аппаратно-независимый прикладной программный интерфейс для разработчиков программного обеспечения. Cairo предоставляет графические примитивы для отрисовки двумерных изображений посредством разнообразных бекендов. Когда есть возможность, Cairo использует аппаратное ускорение. Существует официальное предложение по стандартизации в языке C++ прикладного программного интерфейса отрисовки двумерной графики на основе библиотеки Cairo. Сайт
  • Simple DirectMedia Layer (SDL) — это свободная кроссплатформенная мультимедийная библиотека, реализующая единый программный интерфейс к графической подсистеме, звуковым устройствам и средствам ввода для широкого спектра платформ. Данная библиотека активно используется при написании кроссплатформенных мультимедийных программ (в основном игр). Сайт
  • POCO (или C++ Portable Components) — это коллекция библиотек классов с открытым исходным кодом, которая упрощает и ускоряет разработку сетевых мультиплатформенных приложений на C++. Сайт
  • SFML (англ. Simple and Fast Multimedia Library — простая и быстрая мультимедийная библиотека) — свободная кроссплатформенная мультимедийная библиотека. Представляет собой объектно-ориентированный аналог SDL. SFML содержит ряд модулей для простого программирования игр и мультимедиа приложений. Сайт
Примеры решения задач
Вопросы
Темы сообщений
Задания А
Задания Б
Задания С
Ссылки
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Print Friendly, PDF & Email

Обсуждение закрыто.