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 | - | Тип элементов.
|
||||
| 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 | При удалении в начале — только удалённые элементы. При удалении в конце — только удалённые элементы и итератор конца. |
resize | Если новый размер меньше старого — только удалённые элементы и итератор конца. Если новый размер больше старого — все итераторы становятся недействительными. |
pop_front, pop_back | До элемента, который был удалён. Итератор конца |
Примечания к недействительности
- При вставке в начало или конец очереди, ссылки не становятся недействительными из-за
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 |
|
||||
const_pointer |
|
||||
iterator | Итератор случайного доступа к value_type |
||||
const_iterator | Итератор случайного доступа к const value_type | ||||
reverse_iterator | std::reverse_iterator<iterator> | ||||
const_reverse_iterator | std::reverse_iterator<const_iterator> |
Члены функций
создаёт deque (общедоступный член-функция) |
|
уничтожает deque (общедоступный член-функция) |
|
| присваивает значения контейнеру (общедоступный член-функция) |
|
| присваивает значения контейнеру (общедоступный член-функция) |
|
|
(C++23) | присваивает диапазон значений контейнеру (общедоступный член-функция) |
| возвращает связанный аллокатор (общедоступный член-функция) |
|
Доступ к элементам |
|
| доступ к указанному элементу с проверкой границ (общедоступный член-функция) |
|
| доступ к указанному элементу (общедоступный член-функция) |
|
| доступ к первому элементу (общедоступный член-функция) |
|
| доступ к последнему элементу (общедоступный член-функция) |
|
Итераторы |
|
|
(C++11) | возвращает итератор к началу (общедоступный член-функция) |
|
(C++11) | возвращает итератор к концу (общедоступный член-функция) |
|
(C++11) | возвращает обратный итератор к началу (общедоступный член-функция) |
|
(C++11) | возвращает обратный итератор к концу (общедоступный член-функция) |
Емкость |
|
| проверяет, пуст ли контейнер (общедоступный член-функция) |
|
| возвращает количество элементов (общедоступный член-функция) |
|
| возвращает максимальное возможное количество элементов (общедоступный член-функция) |
|
|
(DR*) | уменьшает использование памяти, освобождая неиспользуемую память (общедоступный член-функция) |
Изменяющие функции |
|
| очищает содержимое (общедоступный член-функция) |
|
| вставляет элементы (общедоступный член-функция) |
|
|
(C++23) | вставляет диапазон элементов (общедоступный член-функция) |
|
(C++11) | создаёт элемент на месте (общедоступный член-функция) |
| удаляет элементы (общедоступный член-функция) |
|
| добавляет элемент в конец (общедоступный член-функция) |
|
|
(C++11) | создаёт элемент на месте в конце (общедоступный член-функция) |
|
(C++23) | добавляет диапазон элементов в конец (общедоступный член-функция) |
| удаляет последний элемент (общедоступный член-функция) |
|
| вставляет элемент в начало (общедоступный член-функция) |
|
|
(C++11) | создаёт элемент на месте в начале (общедоступный член-функция) |
|
(C++23) | добавляет диапазон элементов в начало (общедоступный член-функция) |
| удаляет первый элемент (общедоступный член-функция) |
|
| изменяет количество хранимых элементов (общедоступный член-функция) |
|
| меняет содержимое (общедоступный член-функция) |
|
Вне-членные функции
|
(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(удалено в C++20)(C++20) | лексикографически сравнивает значения двух deques (шаблон функции) |
специализирует алгоритм std::swap (шаблон функции) |
|
|
(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 |
См. также
| адаптирует контейнер для обеспечения очереди (структуры данных FIFO) (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/deque