std::deque
Definido en el archivo de encabezado <deque> | ||
template< class T, | (1) | |
namespace pmr { template<class T> | (2) | (desde C++17) |
std::deque
(cola doblemente terminada) es un contenedor de secuencia indexada que permite una rápida inserción y eliminación tanto al principio como al final. Además, la inserción y eliminación en cualquier extremo de una cola doblemente terminada nunca invalida los punteros o referencias al resto de los elementos.
A diferencia de std::vector, los elementos de una cola doblemente terminada no se almacenan contiguamente: las implementaciones típicas usan una secuencia de arrays de tamaño fijo asignados individualmente, con contabilidad adicional, lo que significa que el acceso indexado a una cola doblemente terminada debe realizar dos desreferencias de puntero, en comparación con el acceso indexado del vector, que realiza solo una.
El almacenamiento de un deque se expande y contrae automáticamente según sea necesario. La expansión de una deque es más barata que la expansión de un std::vector porque no implica copiar los elementos existentes a una nueva ubicación de memoria. Por otro lado, las colas doblemente terminadas suelen tener un gran coste de memoria mínimo; una cola doblemente terminada que contiene solo un elemento tiene que asignar su array interno complet (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 sobre colas doblemente terminadas es la siguiente:
- Acceso aleatorio - constante O(1).
- Inserción o eliminación de elementos al final o al comienzo - constante O(1).
- Inserción o eliminación de elementos - lineal O(n).
std::deque
cumple con los requerimientos de Contenedor, ContenedorConscienteDeAsignador, ContenedorDeSecuencia y ContenedorReversible.
Contenido |
[editar]Parámetros de plantilla
T | - | El tipo de los elementos.
| ||||
Allocator | - | Un asignador que se usa para adquirir y liberar memoria, y para construir y destruir los elementos en esa memoria. El tipo debe cumplir con los requisitos de Asignador. El comportamiento no está definido si Allocator::value_type no es el mismo que T. |
[editar]Invalidación de iteradores
Esta sección está incompleta |
Todavía hay algunas inexactitudes en esta sección, consulta las páginas de funciones miembro individuales para obtener más detalles.
Operaciones | Invalidado |
---|---|
Todas las operaciones de solo lectura | Nunca |
swap, std::swap | El iterador después del final puede invalidarse (definido por la implementación) |
shrink_to_fit, clear, insert, emplace, push_front, push_back, emplace_front, emplace_back | Siempre |
erase | Si se borra al principio - solo los elementos borrados Si se borra al final - solo los elementos borrados y el iterador después del final |
resize | Si el nuevo tamaño es más pequeño que el anterior: solo los elementos borrados y el iterador después del final Si el nuevo tamaño es más grande que el anterior: todos los iteradores se invalidan |
pop_front | Solo para el elemento borrado |
pop_back | Solo para el elemento borrado y el iterador después del final. |
[editar]Notas de invalidación
- Al insertar en cualquier extremidad de la cola doblemente terminada, las referencias no se invalidan por insert y emplace.
- push_front, push_back, emplace_front y emplace_back no invalidan ninguna referencia a los elementos de la cola doblemente terminada.
- Al borrar en cualquier extremidad de la cola doblemente terminada, las referencias a los elementos no borrados no se invalidan por erase, pop_front y pop_back.
- Una llamada a resize con un tamaño más pequeño no invalida ninguna referencia a los elementos no borrados.
- Una llamada a resize con un tamaño más grande no invalida ninguna referencia a los elementos de la cola doblemente terminada.
[editar]Tipos miembro
Tipo miembro | Definición |
value_type | T |
allocator_type | Allocator |
size_type | Tipo entero sin signo (por lo general std::size_t) |
difference_type | Tipo entero con signo (por lo general std::ptrdiff_t) |
reference | Allocator::reference (hasta C++11)value_type& (desde C++11) |
const_reference | Allocator::const_reference (hasta C++11)const value_type& (desde C++11) |
pointer | Allocator::pointer (hasta C++11)std::allocator_traits<Allocator>::pointer(desde C++11) |
const_pointer | Allocator::const_pointer(hasta C++11) std::allocator_traits<Allocator>::const_pointer(desde C++11) |
iterator | IteradorDeAccesoAleatorioLegado |
const_iterator | IteradorDeAccesoAleatorioLegado constante |
reverse_iterator | std::reverse_iterator<iterator> |
const_reverse_iterator | std::reverse_iterator<const_iterator> |
[editar]Funciones miembro
Construye el contenedor deque . (función miembro pública) | |
Destruye el contenedor deque . (función miembro pública) | |
Asigna valores al contenedor. (función miembro pública) | |
Asigna valores al contenedor. (función miembro pública) | |
(C++23) | Asigna un rango de valores al contenedor. (función miembro pública) |
Devuelve el asignador de memoria asociado. (función miembro pública) | |
Acceso a elementos | |
Accede al elemento especificado con comprobación de límites. (función miembro pública) | |
Accede el elemento especificado. (función miembro pública) | |
Accede al primer elemento. (función miembro pública) | |
Accede al último elemento. (función miembro pública) | |
Iteradores | |
(C++11) | Devuelve un iterador al principio. (función miembro pública) |
(C++11) | Devuelve un iterador al final. (función miembro pública) |
(C++11) | Devuelve un iterador inverso al principio. (función miembro pública) |
(C++11) | Devuelve un iterador inverso al final. (función miembro pública) |
Capacidad | |
Comprueba si el contenedor está vacío. (función miembro pública) | |
Devuelve el número de elementos. (función miembro pública) | |
Devuelve el número máximo posible de elementos. (función miembro pública) | |
(C++11) | Reduce el uso de memoria liberando memoria no utilizada. (función miembro pública) |
Modificadores | |
Borra el contenido. (función miembro pública) | |
Inserta elementos (función miembro pública) | |
(C++23) | Inserta un rango de elementos. (función miembro pública) |
(C++11) | Construye el elemento en el sitio. (función miembro pública) |
Borra elementos (función miembro pública) | |
Agrega elementos al final. (función miembro pública) | |
(C++11) | Construye un elemento en el sitio al final. (función miembro pública) |
(C++23) | Agrega un rango de elementos al final. (función miembro pública) |
Remueve el último elemento. (función miembro pública) | |
Inserta un elemento al principio del contenedor. (función miembro pública) | |
(C++11) | Construye un elemento en el sitio al principio del contenedor. (función miembro pública) |
(C++23) | Agrega un rango de elementos al principio. (función miembro pública) |
Remueve el primer elemento. (función miembro pública) | |
Cambia el número de elementos almacenados. (función miembro pública) | |
Intercambia el contenido. (función miembro pública) |
[editar]Funciones no miembro
(eliminado en C++20)(eliminado en C++20)(eliminado en C++20)(eliminado en C++20)(eliminado en C++20)(C++20) | Compara lexicográficamente los valores de deque. (plantilla de función) |
Especializa el algoritmo std::swap. (plantilla de función) | |
Borra todos los elementos que satisfacen un criterio específico. (plantilla de función) |
[editar]Guías de deducción(desde C++17)
[editar]Ejemplo
#include <iostream>#include <deque> int main(){// Crear cola doblemente terminada que contiene enteros std::deque<int> d ={7, 5, 16, 8}; // Agregar un entero al principio y al final de la cola d.push_front(13); d.push_back(25); // Iterar e imprimir los valores en la colafor(int n : d){std::cout<< n <<'\n';}}
Salida:
13 7 5 16 8 25
[editar]Véase también
Adapta un contenedor para proporcionar una cola (estructura de datos PEPS o FIFO, del inglés first in, first out). (plantilla de clase) |