std::deque
(двусторонняя очередь) представляет собой индексированную последовательность контейнеров, которая обеспечивает быструю вставку и удаление как в начале, так и в конце. Кроме того, вставка и удаление на любом конце deque никогда не инвалидирует указатели или ссылки на остальные элементы.
В отличие от
std::vector
, элементы deque не хранятся непрерывно: типичные реализации используют последовательность отдельных выделенных массивов фиксированного размера с дополнительной служебной информацией, что означает, что индексированный доступ к deque должен выполнять два разыменования указателя, по сравнению с индексированным доступом vector, который выполняет только одно.
Хранилище дека автоматически расширяется и сжимается по мере необходимости. Расширение дека обходится дешевле, чем расширение
std::vector
, поскольку оно не связано с копированием существующих элементов в новое место памяти. С другой стороны, дека обычно имеют высокую минимальную стоимость памяти; дек, содержащий всего один элемент, должен выделить полный внутренний массив (например, в 8 раз больше размера объекта в 64-битной libstdc++; в 16 раз больше размера объекта или 4096 байт, в зависимости от того, что больше, в 64-битной libc++).
Сложность (эффективность) стандартных операций с деками следующая:
Произвольный доступ - константный
O(1)
.
Вставка или удаление элементов в конце или начале - константная
O(1)
.
Все функции-члены
std::deque
являются
constexpr
: возможно создавать и использовать объекты
std::deque
при вычислении константного выражения.
Однако, объекты
std::deque
обычно не могут быть
constexpr
, поскольку любая динамически выделенная память должна быть освобождена в том же вычислении константного выражения.
Требования, накладываемые на элементы, зависят от фактических операций, выполняемых с контейнером. Как правило, требуется, чтобы тип элемента был полным типом и удовлетворял требованиям
Erasable
, но многие функции-члены накладывают более строгие требования.
(начиная с C++11)
Allocator
-
Аллокатор, который используется для выделения/освобождения памяти и для создания/уничтожения элементов в этой памяти. Тип должен удовлетворять требованиям
Allocator
.
Поведение не определено
(до C++20)
Программа является некорректной
(начиная с C++20)
если
Allocator::value_type
не совпадает с
T
.
Инвалидация итераторов
Этот раздел не завершён
Причина: В этом разделе всё ещё присутствуют некоторые неточности, для получения более подробной информации обратитесь к страницам отдельных функций-членов
#include <deque>#include <iostream>int main(){// Создаем deque содержащий целые числа
std::deque<int> d ={7, 5, 16, 8};// Добавляем целое число в начало и конец deque
d.push_front(13);
d.push_back(25);// Итерируем и выводим значения dequefor(int n : d)std::cout<< n <<' ';std::cout<<'\n';}
Вывод:
13 7 5 16 8 25
Отчёты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.