Существуют некоторые ограничения на применение контейнеров с определенными адаптерами. Всем адаптерам нужна возможность добавлять и удалять элементы. В результате они не могут быть основаны на массиве. Точно так же нельзя использовать контейнер forward_list, поскольку все адаптеры требуют функций добавления, удаления и обращения к последнему элементу контейнера. Стек требует только функций push_back(), pop_back() и back(), поэтому для стека можно использовать контейнер любого из остальных типов. Адаптеру queue требуются функции back(), push_back(), front() и push_front(), поэтому он может быть создан на основании контейнеров list и deque, но не vector. Адаптеру priority_queue в дополнение к функциям front(), push_back() и pop_back() требуется произвольный доступ к элементам; он может быть основан на контейнерах vector и deque, но не list.
stackТип stack определен в заголовке stack. Функции-члены класса stack перечислены в табл. 9.18. Следующая программа иллюстрирует использование адаптера stack:
stack
//
for (size_t ix = 0; ix != 10; ++ix)
intStack.push(ix); //
while (!intStack.empty()) { //
int value = intStack.top();
//
intStack.pop(); //
}
Сначала intStack объявляется как пустой стек целочисленных элементов:
stack
Затем цикл for добавляет десять элементов, инициализируя каждый следующим целым числом, начиная с нуля. Цикл while перебирает весь стек, извлекая его верхний элемент, пока он не опустеет.
Таблица 9.18. Функции, поддерживаемые адаптером контейнера stack, кроме приведенных в табл. 9.17
По умолчанию используется контейнер deque, но может быть также реализован на основании контейнеров list или vector. | |
|---|---|
s.pop() | Удаляет, но не возвращает верхний элемент из стека |
s.push( | Создает в стеке новый верхний элемент, копируя или перемещая элемент item либо создавая элемент из аргумента параметра |
s.top() | Возвращает, но не удаляет верхний элемент из стека |
Каждый адаптер контейнера определяет собственные функции, исходя из функций, предоставленных базовым контейнером. Использовать можно только функции адаптера, а функции основного контейнера использовать нельзя. Рассмотрим, например, вызов функции push_back() контейнера deque, на котором основан стек intStack:
intStack.push(ix); //
Хотя стек реализован на основании контейнера deque, прямого доступа к его функциям нет. Для стека нельзя вызвать функцию push_back(); вместо нее следует использовать функцию push().
Адаптеры queue и priority_queue определены в заголовке queue. Список функций, поддерживаемых этими типами, приведен в табл. 9.19.
Таблица 9.19. Функции адаптеров queue и priority_queue, кроме приведенных в табл. 9.17