Пространства имён
Варианты
Действия

std::deque

Материал из cppreference.com
< cpp‎ | container
 
 
 
 
Определено в заголовочном файле <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 (двухсторонняя очередь) это индексируемый последовательный контейнер, который позволяет быстро вставлять и удалять как в начале, так и в конце. Кроме того, вставка и удаление на любом конце двухсторонней очереди никогда не делает недействительными указатели или ссылки на остальные элементы.

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

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

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

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


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

Содержание

[править] Параметры шаблона

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 Если удаление в начале только удалённые элементы

При удалении в конце только удалённые элементы и итератор за последним элементом
Иначе все итераторы недействительны.

Не указано, когда конечный итератор становится недействительным. (до C++11)

Конечный итератор также становится недействительным, если только удалённые элементы не находятся в начале контейнера, а последний элемент не удалён. (начиная с C++11)

resize Если новый размер меньше старого - только на удалённые элементы и
конечный итератор
Если новый размер больше старого - все итераторы недействительны
В противном случае ни один итератор не станет недействительным.
pop_front, pop_back Удаление элемента.

Конечный итератор
может быть признан недействительным (определяется реализацией) (до C++11)
также признан недействительным (начиная с 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 в value_type [править]
const_iterator LegacyRandomAccessIterator в const value_type [править]
reverse_iterator std::reverse_iterator<iterator>[править]
const_reverse_iterator std::reverse_iterator<const_iterator>[править]

[править] Функции-элементы

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

[править] Функции, не являющиеся элементами

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

Принципы вывода

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

[править] Примечание

Макрос тест функциональности Значение Стандарт Комментарий
__cpp_lib_containers_ranges 202202L (C++23) Создание и вставка диапазонов для контейнеров

[править] Пример

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

Вывод:

13 7 5 16 8 25

[править] Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

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

[править] Смотрите также

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