std:: deque
|
Определено в заголовочном файле
<deque>
|
||
|
template
<
class
T,
|
(1) | |
|
namespace
pmr
{
template
<
class
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
при вычислении константного выражения.
Однако, объекты
|
(since C++26) |
Содержание |
Параметры шаблона
| 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
|
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
(публичная функция-член) |
|
|
присваивает значения контейнеру
(публичная функция-член) |
|
|
присваивает значения контейнеру
(публичная функция-член) |
|
|
(C++23)
|
присваивает диапазон значений контейнеру
(публичная функция-член) |
|
возвращает связанный аллокатор
(публичная функция-член) |
|
Доступ к элементам |
|
|
доступ к указанному элементу с проверкой границ
(public member function) |
|
|
доступ к указанному элементу
(public member function) |
|
|
доступ к первому элементу
(публичная функция-член) |
|
|
доступ к последнему элементу
(публичная функция-член) |
|
Итераторы |
|
|
(C++11)
|
возвращает итератор на начало
(public member function) |
|
(C++11)
|
возвращает итератор на конец
(публичная функция-член) |
|
(C++11)
|
возвращает обратный итератор на начало
(public member function) |
|
(C++11)
|
возвращает обратный итератор на конец
(публичная функция-член) |
Ёмкость |
|
|
проверяет, является ли контейнер пустым
(public member function) |
|
|
возвращает количество элементов
(публичная функция-член) |
|
|
возвращает максимально возможное количество элементов
(публичная функция-член) |
|
|
(
DR*
)
|
уменьшает использование памяти за счет освобождения неиспользуемой памяти
(публичная функция-член) |
Модификаторы |
|
|
очищает содержимое
(публичная функция-член) |
|
|
вставляет элементы
(публичная функция-член) |
|
|
(C++23)
|
вставляет диапазон элементов
(публичная функция-член) |
|
(C++11)
|
создаёт элемент на месте
(публичная функция-член) |
|
удаляет элементы
(публичная функция-член) |
|
|
добавляет элемент в конец
(public member function) |
|
|
(C++11)
|
создаёт элемент непосредственно в конце контейнера
(публичная функция-член) |
|
(C++23)
|
добавляет диапазон элементов в конец
(public member function) |
|
удаляет последний элемент
(публичная функция-член) |
|
|
вставляет элемент в начало
(публичная функция-член) |
|
|
(C++11)
|
создаёт элемент непосредственно в начале контейнера
(публичная функция-член) |
|
(C++23)
|
добавляет диапазон элементов в начало
(публичная функция-член) |
|
удаляет первый элемент
(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)
(шаблон класса) |