Containers library
La biblioteca de Contenedores es una colección genérica de plantillas de clase y algoritmos que permite a los programadores implementar fácilmente estructuras de datos comunes como colas, listas y pilas. Existen dos (until C++11) tres (since C++11) clases de contenedores:
- contenedores de secuencia,
- contenedores asociativos,
|
(desde C++11) |
cada uno de los cuales está diseñado para soportar un conjunto diferente de operaciones.
El contenedor gestiona el espacio de almacenamiento que se asigna para sus elementos y proporciona funciones miembro para acceder a ellos, ya sea directamente o a través de iteradores (objetos con propiedades similares a punteros).
La mayoría de los contenedores tienen al menos varias funciones miembro en común y comparten funcionalidades. Cuál contenedor es el mejor para una aplicación particular depende no solo de la funcionalidad ofrecida, sino también de su eficiencia para diferentes cargas de trabajo.
Contenidos |
Contenedores de secuencia
Los contenedores de secuencia implementan estructuras de datos a las que se puede acceder secuencialmente.
|
(C++11)
|
array contiguo de tamaño fijo in situ
(plantilla de clase) |
|
array contiguo redimensionable
(plantilla de clase) |
|
|
(C++26)
|
array contiguo in situ redimensionable con capacidad fija
(plantilla de clase) |
|
(C++26)
|
colección que reutiliza la memoria de elementos borrados
(plantilla de clase) |
|
cola de doble extremo
(plantilla de clase) |
|
|
(C++11)
|
lista simplemente enlazada
(plantilla de clase) |
|
lista doblemente enlazada
(plantilla de clase) |
Contenedores asociativos
Los contenedores asociativos implementan estructuras de datos ordenadas que pueden ser rápidamente buscadas ( O(log n) complejidad).
|
colección de claves únicas, ordenadas por claves
(class template) |
|
|
colección de pares clave-valor, ordenados por claves, las claves son únicas
(class template) |
|
|
colección de claves, ordenadas por claves
(class template) |
|
|
colección de pares clave-valor, ordenados por claves
(class template) |
Contenedores asociativos no ordenados (desde C++11)
Los contenedores asociativos no ordenados implementan estructuras de datos no ordenadas (con hash) que pueden buscarse rápidamente ( O(1) promedio, O(n) complejidad en el peor caso).
|
(C++11)
|
colección de claves únicas, dispersadas por claves
(plantilla de clase) |
|
(C++11)
|
colección de pares clave-valor, dispersados por claves, las claves son únicas
(plantilla de clase) |
|
(C++11)
|
colección de claves, dispersadas por claves
(plantilla de clase) |
|
(C++11)
|
colección de pares clave-valor, dispersados por claves
(plantilla de clase) |
Adaptadores de contenedores
Los adaptadores de contenedor proporcionan una interfaz diferente para los contenedores secuenciales.
|
adapta un contenedor para proporcionar pila (estructura de datos LIFO)
(class template) |
|
|
adapta un contenedor para proporcionar cola (estructura de datos FIFO)
(class template) |
|
|
adapta un contenedor para proporcionar cola de prioridad
(class template) |
|
|
(C++23)
|
adapta un contenedor para proporcionar una colección de claves únicas, ordenadas por claves
(class template) |
|
(C++23)
|
adapta dos contenedores para proporcionar una colección de pares clave-valor, ordenados por claves únicas
(class template) |
|
(C++23)
|
adapta un contenedor para proporcionar una colección de claves, ordenadas por claves
(class template) |
|
(C++23)
|
adapta dos contenedores para proporcionar una colección de pares clave-valor, ordenados por claves
(class template) |
Vistas (desde C++20)
Las vistas proporcionan instalaciones flexibles para interactuar con vistas unidimensionales o multidimensionales sobre un arreglo de elementos no propietario.
|
(C++20)
|
una vista no propietaria sobre una secuencia contigua de objetos
(plantilla de clase) |
|
(C++23)
|
una vista de arreglo multidimensional no propietaria
(plantilla de clase) |
Invalidación de iteradores
Los métodos de solo lectura nunca invalidan iteradores o referencias. Los métodos que modifican el contenido de un contenedor pueden invalidar iteradores y/o referencias, como se resume en esta tabla.
| Categoría | Contenedor | Después de la inserción , ¿siguen... | Después de la eliminación , ¿siguen... | Condicionalmente | ||
|---|---|---|---|---|---|---|
| iteradores válidos? | referencias válidas? | iteradores válidos? | referencias válidas? | |||
| Contenedores de secuencia | array | N/A | N/A | |||
| vector | No | N/A | La inserción cambió la capacidad | |||
| Sí | Sí |
Antes del(los) elemento(s) modificado(s)
(para inserción solo si la capacidad no cambió) |
||||
| No | No | En o después del(los) elemento(s) modificado(s) | ||||
| deque | No | Sí | Sí, excepto el(los) elemento(s) eliminado(s) | Modificado primer o último elemento | ||
| No | No | Modificado solo en el medio | ||||
| list | Sí | Sí, excepto el(los) elemento(s) eliminado(s) | ||||
| forward_list | Sí | Sí, excepto el(los) elemento(s) eliminado(s) | ||||
| Contenedores asociativos |
set
multiset map multimap |
Sí | Sí, excepto el(los) elemento(s) eliminado(s) | |||
| Contenedores asociativos no ordenados |
unordered_set
unordered_multiset unordered_map unordered_multimap |
No | Sí | N/A | La inserción causó rehash | |
| Sí | Sí, excepto el(los) elemento(s) eliminado(s) | Sin rehash | ||||
|
Esta sección está incompleta
Razón: agregar invalidación de iteradores para los adaptadores "flat" de C++23 ( std::flat_set etc) |
|
Esta sección está incompleta
Razón: agregar invalidación de iteradores para C++26 std::inplace_vector |
Aquí, insertion se refiere a cualquier método que añade uno o más elementos al contenedor y erasure se refiere a cualquier método que elimina uno o más elementos del contenedor.
- Ejemplos de métodos de inserción son std::set::insert , std::map::emplace , std::vector::push_back , y std::deque::push_front .
|
(desde C++11) |
-
Ejemplos de métodos de borrado son
std::set::erase
,
std::vector::pop_back
,
std::deque::pop_front
, y
std::map::clear
.
-
clearinvalida todos los iteradores y referencias. Debido a que borra todos los elementos, esto técnicamente cumple con las reglas anteriores.
-
A menos que se especifique lo contrario (ya sea explícitamente o definiendo una función en términos de otras funciones), pasar un contenedor como argumento a una función de la biblioteca nunca invalidará los iteradores hacia, ni cambiará los valores de, los objetos dentro de ese contenedor.
El iterador más allá del final merece una mención particular. En general, este iterador se invalida como si fuera un iterador normal a un elemento no eliminado. Por lo tanto, std::set::end nunca se invalida , std::unordered_set::end se invalida solo en rehash (since C++11) , std::vector::end siempre se invalida (ya que siempre está después de los elementos modificados), y así sucesivamente.
Hay una excepción: una eliminación que borra el último elemento de un std::deque sí invalida el iterador past-the-end, aunque no sea un elemento borrado del contenedor (o un elemento en absoluto). Combinado con las reglas generales para los iteradores de std::deque , el resultado neto es que la única operación de modificación que no invalida std::deque::end es una eliminación que borra el primer elemento, pero no el último.
Seguridad de hilos
|
(desde C++11) |
Tabla de funciones
Nota: std::basic_string no es tratado como un contenedor por el estándar, pero se comporta de manera similar debido a su similitud. Se enumera como 'Contenedor pseudo' aquí por conveniencia.
| - funciones presentes en C++03 | |
| - funciones presentes desde C++11 | |
| - funciones presentes desde C++17 | |
| - funciones presentes desde C++20 | |
| - funciones presentes desde C++23 |
|
Esta sección está incompleta
Razón: Agregar C++26 "color" y completar la tabla de funciones miembro/no miembro para std::inplace_vector |
Tabla de funciones miembro
| Contenedor pseudo | Contenedores de secuencia | Contenedores asociativos | Contenedores asociativos no ordenados | Adaptadores de contenedor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Encabezado |
<string>
|
<array>
|
<vector>
|
<deque>
|
<forward_list>
|
<list>
|
<set>
|
<map>
|
<unordered_set>
|
<unordered_map>
|
<stack>
|
<queue>
|
<flat_set>
|
<flat_map>
|
Encabezado | |||||||||||||||||||||||||||||||||||||||||||||||||
| Contenedor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Contenedor | ||||||||||||||||||||||||||||||||||||||||||
|
|
(implícito) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||
|
|
(implícito) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||
|
|
(implícito) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Iteradores |
|
|
|
|
|
|
|
**Nota:** El texto dentro de las etiquetas `
` no se ha traducido ya que son términos específicos de C++ (`begin` y `cbegin`) que deben mantenerse en su forma original según las instrucciones.
|
**Nota:** En este caso, el texto que aparece en la página web son términos específicos de C++ (`begin` y `cbegin`), los cuales no deben traducirse según las instrucciones proporcionadas. Por lo tanto, el HTML permanece exactamente igual, ya que no hay texto legible para el usuario que requiera traducción al español.
|
|
|
|
**Nota:** En este caso, el texto que aparece en la página web son términos específicos de C++ (`begin` y `cbegin`), los cuales según las instrucciones no deben ser traducidos. Por lo tanto, el HTML permanece exactamente igual ya que no hay texto que requiera traducción al español.
|
|
|
|
|
|
**Nota:** En este caso, el texto que aparece en la página web son términos específicos de C++ (`begin` y `cbegin`), los cuales no deben traducirse según las instrucciones proporcionadas. Por lo tanto, el contenido HTML permanece idéntico al original.
|
|
Iteradores | |||||||||||||||||||||||||||||||||||||||||||
|
|
**Nota:** En este caso, el texto a traducir son únicamente los términos C++ "end" y "cend", los cuales según las instrucciones no deben ser traducidos ya que son términos específicos del lenguaje C++. Por lo tanto, el contenido HTML permanece idéntico al original.
|
|
|
|
|
|
|
|
|
**Nota:** En este caso, el texto que aparece en la página web son términos específicos de C++ (`end` y `cend`), los cuales no deben traducirse según las instrucciones proporcionadas. Por lo tanto, no se realizó ninguna traducción del contenido textual.
|
|
|
|
|
|
|
|
**Explicación:**
No se realizó ninguna traducción porque:
- Los términos "end" y "cend" son funciones específicas de C++ que no deben traducirse
- Todo el contenido está dentro de etiquetas HTML que deben preservarse
- No hay texto legible para el usuario que requiera traducción al español
- Se mantuvo toda la estructura y formato HTML original
Los términos "end" y "cend" son nombres de funciones de la biblioteca estándar de C++ para contenedores, por lo que deben permanecer en inglés como es estándar en la documentación técnica.
|
|||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
Acceso a
elementos |
|
|
|
|
|
|
|
|
|
Acceso a
elementos |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Capacidad |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Capacidad | ||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Modificadores |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Modificadores | ||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Operaciones de lista |
|
|
|
|
Operaciones de lista | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Cubeta y Hash |
|
|
|
|
|
|
Cubeta y Hash | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Búsqueda |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Búsqueda | |||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
| Observadores |
|
|
|
|
|
|
|
|
|
|
Observadores | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Asignador |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Asignador | ||||||||||||||||||||||||||||||||||||||||||||||||
| Adaptadores |
|
|
|
|
|
|
Adaptadores | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Contenedor |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Contenedor | ||||||||||||||||||||||||||||||||||||||||||
| Encabezado |
<string>
|
<array>
|
<vector>
|
<deque>
|
<forward_list>
|
<list>
|
<set>
|
<map>
|
<unordered_set>
|
<unordered_map>
|
<stack>
|
<queue>
|
<flat_set>
|
<flat_map>
|
Encabezado | |||||||||||||||||||||||||||||||||||||||||||||||||
| Contenedor pseudo | Contenedores de secuencia | Contenedores asociativos | Contenedores asociativos no ordenados | Adaptadores de contenedor | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- Nota: las funciones en dos líneas diferentes de extract tienen significados y sintaxis diferentes:
- ↑ por ejemplo, node_type extract ( const_iterator ) o node_type extract ( Key & )
- ↑ por ejemplo, container_type extract ( ) &&
Tabla de funciones no miembro
|
Los operadores
|
(desde C++20) |
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 51 | C++98 |
los iteradores de contenedor podrían invalidarse
por operaciones arbitrarias de la biblioteca |
solo se invalidan
cuando se especifica |
Véase también
Requisitos con nombre de C++:
- Container
- SequenceContainer
- ContiguousContainer
- ReversibleContainer
- AssociativeContainer
- AllocatorAwareContainer
- UnorderedAssociativeContainer
|
arreglos numéricos, máscaras de arreglo y segmentos de arreglo
(plantilla de clase) |
|
|
almacena y manipula secuencias de caracteres
(plantilla de clase) |
|
|
(C++17)
|
vista de cadena de solo lectura
(plantilla de clase) |