std::deque
(cola de doble extremo) es un contenedor de secuencia indexado que permite una inserción y eliminación rápidas tanto al principio como al final. Además, la inserción y eliminación en cualquier extremo de un deque nunca invalida punteros o referencias al resto de los elementos.
A diferencia de
std::vector
, los elementos de un deque no se almacenan de forma contigua: las implementaciones típicas utilizan una secuencia de arrays de tamaño fijo asignados individualmente, con contabilidad adicional, lo que significa que el acceso indexado a deque debe realizar dos desreferencias de puntero, en comparación con el acceso indexado de vector que realiza solo una.
El almacenamiento de un deque se expande y contrae automáticamente según sea necesario. La expansión de un deque es más económica que la expansión de un
std::vector
porque no implica la copia de los elementos existentes a una nueva ubicación de memoria. Por otro lado, los deques típicamente tienen un alto costo mínimo de memoria; un deque que contiene solo un elemento debe asignar su arreglo interno completo (por ejemplo, 8 veces el tamaño del objeto en libstdc++ de 64 bits; 16 veces el tamaño del objeto o 4096 bytes, lo que sea mayor, en libc++ de 64 bits).
La complejidad (eficiencia) de las operaciones comunes en deques es la siguiente:
Acceso aleatorio - constante
O(1)
.
Inserción o eliminación de elementos al final o al principio - constante
O(1)
.
Inserción o eliminación de elementos - lineal
O(n)
.
Todas las funciones miembro de
std::deque
son
constexpr
: es posible crear y utilizar objetos
std::deque
en la evaluación de una expresión constante.
Sin embargo,
std::deque
generalmente no puede ser
constexpr
, porque cualquier almacenamiento asignado dinámicamente debe liberarse en la misma evaluación de la expresión constante.
Los requisitos que se imponen sobre los elementos dependen de las operaciones reales realizadas en el contenedor. Generalmente, se requiere que el tipo de elemento sea un tipo completo y cumpla con los requisitos de
Erasable
, pero muchas funciones miembro imponen requisitos más estrictos.
(desde C++11)
Allocator
-
Un asignador que se utiliza para adquirir/liberar memoria y para construir/destruir los elementos en esa memoria. El tipo debe cumplir con los requisitos de
Allocator
.
El comportamiento es indefinido
(hasta C++20)
El programa está mal formado
(desde C++20)
si
Allocator::value_type
no es el mismo que
T
.
Invalidación de iteradores
Esta sección está incompleta
Razón: Todavía hay algunas inexactitudes en esta sección, consulte las páginas de funciones miembro individuales para más detalles
#include <deque>#include <iostream>int main(){// Crear un deque que contenga enteros
std::deque<int> d ={7, 5, 16, 8};// Agregar un entero al principio y al final del deque
d.push_front(13);
d.push_back(25);// Iterar e imprimir valores del dequefor(int n : d)std::cout<< n <<' ';std::cout<<'\n';}
Salida:
13 7 5 16 8 25
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.