Основные Понятия Стандартной Библиотеки C++

В этой статье определяются основные понятия стандартной библиотеки C++.

Он предоставлен для дальнейшего использования.

Самой большой частью стандартной библиотеки C++ является библиотека STL (стандартная библиотека шаблонов).

Библиотека STL содержит пять основных типов компонентов:

  • контейнер : Управляет набором объектов в памяти.

  • итератор : предоставляет алгоритму возможность доступа к содержимому контейнера.

  • алгоритм : Определяет вычислительную процедуру.

  • функциональный объект : инкапсулирует функцию в объект для использования другими компонентами.

  • адаптер : адаптирует компонент для предоставления другого интерфейса.



Основные понятия стандартной библиотеки C++

Все компоненты удовлетворяют ряду требований и поэтому хорошо сочетаются друг с другом.

Из определения контейнера следует, что любая определяемая пользователем структура данных является контейнером.

В нашем случае контейнеры имеют стандартные структуры данных , такие как list (список), вектор (вектор), словарь (карта) и многие другие.

Формальные требования к контейнерам достаточно обширны, но главным из них является правило доступа к элементам.

Доступ к элементам контейнера осуществляется через специальные объекты — итераторы (см.

ниже).

Вы можете не знать, как элементы контейнера располагаются в памяти, но вы знаете, что итераторы могут выполняться последовательно, и каждый из них будет предоставлять доступ к элементу.

Итератор, указывающий на первый элемент, можно получить с помощью метода итератор начать(); контейнер.

Итератор, указывающий за последний элемент, можно получить с помощью метода конец итератора(); контейнер.

Другими словами, итераторы расположены в полуинтервал (или полуотрезок), что формально можно записать как [начало, конец).

Пример объявления контейнера:

  
  
  
  
   

struct a_container { struct an_iterator; an_iterator begin(); an_iterator end(); };

Будущий стандарт C++20 предлагает использовать структуру, инкапсулирующую полуинтервалы.

диапазоны

Итератор — это объект, который обеспечивает доступ к элементам контейнера и позволяет перебирать их.

Итератор — это свойство контейнера.

В ранних реализациях стандартной библиотеки C++ итератор был реализован как указатель на элемент контейнера.

В современных реализациях это класс, инкапсулирующий указатель на объект-контейнер.

Основные требования к итераторам — наличие операторов разыменования и инкремента.

Ниже приведено объявление контейнера с итератором.



template<typename TYPE> struct a_container { struct an_iterator { void operator++(); TYPE& operator*(); }; an_iterator begin(); an_iterator end(); };

Я не могу дать лучшего определения алгоритма, чем стандартное: Алгоритм — это последовательность действий, приводящая к желаемому результату за конечное число шагов.

.

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

Общая сигнатура этих алгоритмов описывается следующим образом:

template<typename ITERATOR, typename RESULT> RESULT an_algorithm(ITERATOR first, ITERATOR last, .

);

Вы можете переопределить оператор () в объявлении класса.

Если этот оператор переопределен в классе, то объекты этого класса получают свойства функций (их можно использовать как функции).

Такие объекты называются функциональными или функторы .

Функторы удобно использовать, когда функция должна иметь «память», а также в качестве замены указателей на функции.

Начиная со стандарта C++11, можно кратко писать функторы — лямбда-функции.

К функторам особых требований не предъявляется.

За исключением того, что иногда может потребоваться наследование от функтора.

функция (до стандарта C++11 — unary_function илиbinary_function).

Небольшой пример реализации функтора:

template<typename TYPE> struct plus{ TYPE operator ()(const TYPE& p1, const TYPE& p2) const{ return p1 + p2; } };

STL также предлагает ряд классов и функций (функторов), преобразующих интерфейс в нужный.

В частности, существует адаптер стека, реализующий стек на основе контейнеров.

В качестве примера рассмотрим переход бинарной функции в унарную (эта функция в настоящее время признана устаревшей в стандарте C++):

template<typename BIDIRECTIONAL_FUNCTION, typename TYPE> 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); } };



Для самостоятельного чтения

  1. Черновик стандарта C++20 на GitHub
  2. Справочник по С++
  3. Разработка приложений на C++
  4. Range-v3, предложение по стандарту
Теги: #C++ #STL
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.