Namespaces
Variants

std:: deque

From cppreference.net
Определено в заголовочном файле <deque>
template <

class T,
class Allocator = std:: allocator < T >

> class deque ;
(1)
namespace pmr {

template < class T >
using deque = std :: deque < T, std:: pmr :: polymorphic_allocator < T >> ;

}
(2) (начиная с C++17)

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

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

Хранилище дека автоматически расширяется и сжимается по мере необходимости. Расширение дека обходится дешевле, чем расширение std::vector , поскольку оно не связано с копированием существующих элементов в новое место памяти. С другой стороны, дека обычно имеют высокую минимальную стоимость памяти; дек, содержащий всего один элемент, должен выделить полный внутренний массив (например, в 8 раз больше размера объекта в 64-битной libstdc++; в 16 раз больше размера объекта или 4096 байт, в зависимости от того, что больше, в 64-битной libc++).

Сложность (эффективность) стандартных операций с деками следующая:

  • Произвольный доступ - константный O(1) .
  • Вставка или удаление элементов в конце или начале - константная O(1) .
  • Вставка или удаление элементов - линейная O(n) .

std::deque удовлетворяет требованиям Container , AllocatorAwareContainer , SequenceContainer и ReversibleContainer .

Все функции-члены std::deque являются constexpr : возможно создавать и использовать объекты std::deque при вычислении константного выражения.

Однако, объекты std::deque обычно не могут быть constexpr , поскольку любая динамически выделенная память должна быть освобождена в том же вычислении константного выражения.

(since C++26)

Содержание

Параметры шаблона

T - Тип элементов.
T должен удовлетворять требованиям CopyAssignable и CopyConstructible . (до C++11)
Требования, накладываемые на элементы, зависят от фактических операций, выполняемых с контейнером. Как правило, требуется, чтобы тип элемента был полным типом и удовлетворял требованиям Erasable , но многие функции-члены накладывают более строгие требования. (начиная с C++11)

Allocator - Аллокатор, который используется для выделения/освобождения памяти и для создания/уничтожения элементов в этой памяти. Тип должен удовлетворять требованиям Allocator . Поведение не определено (до C++20) Программа является некорректной (начиная с C++20) если Allocator::value_type не совпадает с T .

Инвалидация итераторов

Операции Инвалидируются
Все операции только для чтения. Никогда.
swap , std::swap Итератор за последним элементом может быть инвалидирован (определяется реализацией).
shrink_to_fit , clear , insert ,
emplace , push_front , push_back ,
emplace_front , emplace_back
Всегда.
erase Если удаление в начале - только удаленные элементы.

Если удаление в конце - только удаленные элементы и итератор за последним элементом.
В противном случае - все итераторы инвалидируются.

Не определено, когда инвалидируется итератор за последним элементом.

(until C++11)

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

(since C++11)
resize Если новый размер меньше старого - только удаленные элементы и
итератор за последним элементом.

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

pop_front , pop_back На удаленный элемент.

Итератор за последним элементом может быть инвалидирован (определяется реализацией).

(until C++11)

Итератор за последним элементом также инвалидируется.

(since C++11)

Примечания о недействительности

  • При вставке в любой конец дека ссылки не инвалидируются insert и emplace .
  • push_front , push_back , emplace_front и emplace_back не инвалидируют никакие ссылки на элементы дека.
  • При удалении из любого конца дека ссылки на неудаленные элементы не инвалидируются erase , pop_front и pop_back .
  • Вызов resize с меньшим размером не инвалидирует никакие ссылки на неудаленные элементы.
  • Вызов resize с большим размером не инвалидирует никакие ссылки на элементы дека.

Типы членов

Тип члена Определение
value_type T
allocator_type Allocator
size_type Беззнаковый целочисленный тип (обычно std::size_t )
difference_type Знаковый целочисленный тип (обычно std::ptrdiff_t )
reference value_type &
const_reference const value_type &
pointer

Allocator::pointer

(до C++11)

std:: allocator_traits < Allocator > :: pointer

(с C++11)
const_pointer

Allocator::const_pointer

(до C++11)

std:: allocator_traits < Allocator > :: const_pointer

(с C++11)
iterator LegacyRandomAccessIterator и ConstexprIterator (с C++26) для value_type
const_iterator LegacyRandomAccessIterator и ConstexprIterator (с C++26) для const value_type
reverse_iterator std:: reverse_iterator < iterator >
const_reverse_iterator std:: reverse_iterator < const_iterator >

Функции-члены

создаёт deque
(публичная функция-член)
уничтожает deque
(публичная функция-член)
присваивает значения контейнеру
(публичная функция-член)
присваивает значения контейнеру
(публичная функция-член)
присваивает диапазон значений контейнеру
(публичная функция-член)
возвращает связанный аллокатор
(публичная функция-член)
Доступ к элементам
доступ к указанному элементу с проверкой границ
(public member function)
доступ к указанному элементу
(public member function)
доступ к первому элементу
(публичная функция-член)
доступ к последнему элементу
(публичная функция-член)
Итераторы
возвращает итератор на начало
(public member function)
(C++11)
возвращает итератор на конец
(публичная функция-член)
возвращает обратный итератор на начало
(public member function)
(C++11)
возвращает обратный итератор на конец
(публичная функция-член)
Ёмкость
проверяет, является ли контейнер пустым
(public member function)
возвращает количество элементов
(публичная функция-член)
возвращает максимально возможное количество элементов
(публичная функция-член)
уменьшает использование памяти за счет освобождения неиспользуемой памяти
(публичная функция-член)
Модификаторы
очищает содержимое
(публичная функция-член)
вставляет элементы
(публичная функция-член)
вставляет диапазон элементов
(публичная функция-член)
(C++11)
создаёт элемент на месте
(публичная функция-член)
удаляет элементы
(публичная функция-член)
добавляет элемент в конец
(public member function)
создаёт элемент непосредственно в конце контейнера
(публичная функция-член)
добавляет диапазон элементов в конец
(public member function)
удаляет последний элемент
(публичная функция-член)
вставляет элемент в начало
(публичная функция-член)
создаёт элемент непосредственно в начале контейнера
(публичная функция-член)
добавляет диапазон элементов в начало
(публичная функция-член)
удаляет первый элемент
(public member function)
изменяет количество хранимых элементов
(публичная функция-член)
обменивает содержимое
(public member function)

Функции, не являющиеся членами класса

(удалено в C++20) (удалено в C++20) (удалено в C++20) (удалено в C++20) (удалено в C++20) (C++20)
лексикографически сравнивает значения двух deque
(шаблон функции)
специализирует алгоритм std::swap
(шаблон функции)
удаляет все элементы, удовлетворяющие определённым критериям
(шаблон функции)

Руководства по выводу

(начиная с C++17)

Примечания

Макрос тестирования возможностей Значение Стандарт Функция
__cpp_lib_containers_ranges 202202L (C++23) Конструирование и вставка диапазонов для контейнеров
__cpp_lib_constexpr_deque 202502L (C++26) constexpr std::deque

Пример

#include <deque>
#include <iostream>
int main()
{
    // Создаем deque содержащий целые числа
    std::deque<int> d = {7, 5, 16, 8};
    // Добавляем целое число в начало и конец deque
    d.push_front(13);
    d.push_back(25);
    // Итерируем и выводим значения deque
    for (int n : d)
        std::cout << n << ' ';
    std::cout << '\n';
}

Вывод:

13 7 5 16 8 25

Отчёты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 230 C++98 T не требовалось быть CopyConstructible
(элемент типа T мог быть неконструируемым)
T также требуется
быть CopyConstructible

Смотрите также

адаптирует контейнер для предоставления очереди (структура данных FIFO)
(шаблон класса)