Spec-Zone.ru › C++

std::deque

Определено в заголовке <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 удовлетворяет требованиям Контейнера, Контейнера с поддержкой аллокаторов, Последовательного контейнера и Обратимого контейнера.

Шаблонные параметры

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 Итератор случайного доступа к value_type
const_iterator Итератор случайного доступа к const value_type
reverse_iterator std::reverse_iterator<iterator>
const_reverse_iterator std::reverse_iterator<const_iterator>

Члены функций

(конструктор)
создаёт deque
(общедоступный член-функция)
(деструктор)
уничтожает deque
(общедоступный член-функция)
operator=
присваивает значения контейнеру
(общедоступный член-функция)
assign
присваивает значения контейнеру
(общедоступный член-функция)
assign_range
(C++23)
присваивает диапазон значений контейнеру
(общедоступный член-функция)
get_allocator
возвращает связанный аллокатор
(общедоступный член-функция)
Доступ к элементам
at
доступ к указанному элементу с проверкой границ
(общедоступный член-функция)
operator[]
доступ к указанному элементу
(общедоступный член-функция)
front
доступ к первому элементу
(общедоступный член-функция)
back
доступ к последнему элементу
(общедоступный член-функция)
Итераторы
begincbegin
(C++11)
возвращает итератор к началу
(общедоступный член-функция)
endcend
(C++11)
возвращает итератор к концу
(общедоступный член-функция)
rbegincrbegin
(C++11)
возвращает обратный итератор к началу
(общедоступный член-функция)
rendcrend
(C++11)
возвращает обратный итератор к концу
(общедоступный член-функция)
Емкость
empty
проверяет, пуст ли контейнер
(общедоступный член-функция)
size
возвращает количество элементов
(общедоступный член-функция)
max_size
возвращает максимальное возможное количество элементов
(общедоступный член-функция)
shrink_to_fit
(DR*)
уменьшает использование памяти, освобождая неиспользуемую память
(общедоступный член-функция)
Изменяющие функции
clear
очищает содержимое
(общедоступный член-функция)
insert
вставляет элементы
(общедоступный член-функция)
insert_range
(C++23)
вставляет диапазон элементов
(общедоступный член-функция)
emplace
(C++11)
создаёт элемент на месте
(общедоступный член-функция)
erase
удаляет элементы
(общедоступный член-функция)
push_back
добавляет элемент в конец
(общедоступный член-функция)
emplace_back
(C++11)
создаёт элемент на месте в конце
(общедоступный член-функция)
append_range
(C++23)
добавляет диапазон элементов в конец
(общедоступный член-функция)
pop_back
удаляет последний элемент
(общедоступный член-функция)
push_front
вставляет элемент в начало
(общедоступный член-функция)
emplace_front
(C++11)
создаёт элемент на месте в начале
(общедоступный член-функция)
prepend_range
(C++23)
добавляет диапазон элементов в начало
(общедоступный член-функция)
pop_front
удаляет первый элемент
(общедоступный член-функция)
resize
изменяет количество хранимых элементов
(общедоступный член-функция)
swap
меняет содержимое
(общедоступный член-функция)

Вне-членные функции

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

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

(с C++17)

Примечания

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

Пример

#include <deque>
#include <iostream>
 
int main()
{
    // Create a deque containing integers
    std::deque<int> d = {7, 5, 16, 8};
 
    // Add an integer to the beginning and end of the deque
    d.push_front(13);
    d.push_back(25);
 
    // Iterate and print values of 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

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/deque

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API