В этой статье определяются основные понятия стандартной библиотеки C++.
Он предоставлен для дальнейшего использования.
Самой большой частью стандартной библиотеки C++ является библиотека STL (стандартная библиотека шаблонов).
Библиотека STL содержит пять основных типов компонентов:
- контейнер : Управляет набором объектов в памяти.
- итератор : предоставляет алгоритму возможность доступа к содержимому контейнера.
- алгоритм : Определяет вычислительную процедуру.
- функциональный объект : инкапсулирует функцию в объект для использования другими компонентами.
- адаптер : адаптирует компонент для предоставления другого интерфейса.
Все компоненты удовлетворяют ряду требований и поэтому хорошо сочетаются друг с другом.
Из определения контейнера следует, что любая определяемая пользователем структура данных является контейнером.
В нашем случае контейнеры имеют стандартные структуры данных , такие как 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);
}
};
Для самостоятельного чтения
- Черновик стандарта C++20 на GitHub
- Справочник по С++
- Разработка приложений на C++
- Range-v3, предложение по стандарту
-
Все Места Разломов В 4-М Сезоне Fortnite
19 Oct, 24 -
Дешевый Android-Планшет На Подъеме
19 Oct, 24 -
Интерфейсы В Реальном Мире
19 Oct, 24 -
Универсальное Зарядное Устройство Usb
19 Oct, 24 -
Часы-Телефон С Сенсорным Экраном От Hyundai
19 Oct, 24 -
Сериал «Чернобыль»: Смотри И Думай
19 Oct, 24