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