std::unordered_map
Definido en el archivo de encabezado <unordered_map> | ||
template< class Key, | (1) | (desde C++11) |
namespace pmr { template<class Key, | (2) | (desde C++17) |
std::unordered_map
es un contenedor asociativo que contiene pares clave-valor con claves únicas. La búsqueda, inserción y eliminación de elementos tienen una complejidad promedio de tiempo constante.
Internamente, los elementos no se ordenan en ningún orden en particular, sino que se organizan en grupos. En qué depósito se coloca un elemento depende completamente del valor de dispersión (hash) de su clave. Las claves con el mismo código de dispersión aparecen en el mismo depósito. Esto permite un acceso rápido a elementos individuales, ya que una vez que se calcula el valor de dispersión, se refiere al depósito exacto en el que se coloca el elemento.
std::unordered_map
cumple con los requerimientos de Container, AllocatorAwareContainer, UnorderedAssociativeContainer.
Contenido |
[editar]Invalidación de iteradores
Operaciones | Se invalida |
---|---|
Todas las operaciones de solo lectura, swap, std::swap | Nunca |
clear, rehash, reserve, operator= | Siempre |
insert, emplace, emplace_hint, operator[] | Solo si ocasiona redispersión |
erase | Solo para el elemento borrado |
[editar]Notas
- Las funciones de intercambio no invalidan ninguno de los iteradores dentro del contenedor, pero sí invalidan el iterador que marca el final de la región de intercambio.
- Las referencias y punteros a la clave o los datos almacenados en el contenedor solo se invalidan al borrar ese elemento, incluso cuando el iterador correspondiente está invalidado.
[editar]Tipos miembro
Tipo miembro | Definición |
key_type | Key |
mapped_type | T |
value_type | std::pair<const Key, T> |
size_type | Tipo entero sin signo (por lo general std::size_t) |
difference_type | Tipo entero con signo (por lo general std::ptrdiff_t) |
hasher | Hash |
key_equal | KeyEqual |
allocator_type | Allocator |
reference | value_type& |
const_reference | const value_type& |
pointer | std::allocator_traits<Allocator>::pointer |
const_pointer | std::allocator_traits<Allocator>::const_pointer |
iterator | IteradorDeAvanceLegado |
const_iterator | IteradorDeAvanceLegado constante |
local_iterator | Un tipo iterador cuyos tipos de referencia de categoría, valor, diferencia, puntero y son los mismos que iterator . Este iteradorse puede usar para iterar a través de un solo depósito, pero no a través de depósitos. |
const_local_iterator | Un tipo iterador cuyos tipos de referencia de categoría, valor, diferencia, puntero y son los mismos que const_iterator . Este iteradorse puede usar para iterar a través de un solo depósito, pero no a través de depósitos. |
node_type (desde C++17) | Una especialización de node handle que representa un nodo del contenedor. |
insert_return_type (desde C++17) | Tipo que describe el resultado de insertar un tipo nodo node_type , una especialización detemplate<class Iter, class NodeType> |
[editar]Funciones miembro
Construye el contenedor unordered_map . (función miembro pública) | |
(C++11) | Destruye el contenedor unordered_map . (función miembro pública) |
(C++11) | Asigna valores al contenedor. (función miembro pública) |
(C++11) | Devuelve el asignador de memoria asociado. (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) |
Capacidad | |
(C++11) | Comprueba si el contenedor está vacío. (función miembro pública) |
(C++11) | Devuelve el número de elementos. (función miembro pública) |
(C++11) | Devuelve el número máximo posible de elementos. (función miembro pública) |
Modificadores | |
(C++11) | Borra el contenido. (función miembro pública) |
(C++11) | Inserta elementos o nodos(desde C++17) (función miembro pública) |
(C++17) | Inserta un elemento o asigna el elemento actual si la clave ya existe. (función miembro pública) |
(C++11) | Construye el elemento en el sitio. (función miembro pública) |
(C++11) | Construye elementos en el sitio utilizando una pista. (función miembro pública) |
(C++17) | Inserta en el sitio si la clave no existe; no hace nada si la clave existe. (función miembro pública) |
(C++11) | Borra elementos (función miembro pública) |
(C++11) | Intercambia el contenido. (función miembro pública) |
(C++17) | Extrae nodos del contenedor (función miembro pública) |
(C++17) | Mueve los nodos de otro contenedor. (función miembro pública) |
Búsqueda | |
Accede al elemento especificado con comprobación de límites. (función miembro pública) | |
(C++11) | Accede o inserta el elemento especificado. (función miembro pública) |
(C++11) | Devuelve el número de elementos que coinciden con una clave específica. (función miembro pública) |
(C++11) | Encuentra un elemento con una clave específica. (función miembro pública) |
(C++20) | Comprueba si el contenedor contiene un elemento con una clave específica. (función miembro pública) |
(C++11) | Devuelve un rango de elementos que coinciden con una clase específica. (función miembro pública) |
Interfaz de depósito | |
Devuelve un iterador al principio del depósito especificado. (función miembro pública) | |
Devuelve un iterador al final del depósito especificado. (función miembro pública) | |
(C++11) | Devuelve el número de depósitos. (función miembro pública) |
(C++11) | Devuelve el número máximo de depósitos. (función miembro pública) |
(C++11) | Devuelve el número de elementos en un depósito específico. (función miembro pública) |
(C++11) | Devuelve un depósito para una clave específica. (función miembro pública) |
Política de dispersión | |
(C++11) | Devuelve el promedio del número de elementos por depósito. (función miembro pública) |
(C++11) | Gestiona el promedio máximo del número de elementos por depósito. (función miembro pública) |
(C++11) | Reserva al menos el número de depósitos especificados y regenera la tabla de dispersión. (función miembro pública) |
(C++11) | Reserva espacio para al menos el número de elementos especificado y regenera la tabla de dispersión. (función miembro pública) |
Observadores | |
(C++11) | Devuelve la función usada para dispersar las claves. (función miembro pública) |
(C++11) | Devuelve la función usada para comparar la igualdad de las claves. (función miembro pública) |
[editar]Funciones no miembro
Compara los valores de unordered_map. (plantilla de función) | |
Especializa el algoritmo std::swap. (plantilla de función) | |
(C++20) | 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 <string>#include <unordered_map> int main(){// Crea un unordered_map de tres cadenas (que se asocian a cadenas) std::unordered_map<std::string, std::string> u ={{"ROJO","#FF0000"}, {"VERDE","#00FF00"}, {"AZUL","#0000FF"}}; std::cout<<"Iterar e imprimir claves y valores de unordered_map, siendo explícito con\n""el tipo del iterador, n:\n";for(conststd::pair<std::string, std::string>& n : u ){std::cout<<"Clave:["<< n.first<<"] Valor:["<< n.second<<"]\n";} std::cout<<"Iterar e imprimir claves y valores de unordered_map, usando auto:\n";for(constauto& n : u ){std::cout<<"Clave:["<< n.first<<"] Valor:["<< n.second<<"]\n";} std::cout<<"Iterar e imprimir claves y valores usando vínculos estructurados (desde C++17):\n";for(constauto&[key, value]: u ){std::cout<<"Clave:["<< key <<"] Valor:["<< value <<"]\n";} // Añadir dos nuevas entradas al unordered_map u["BLACK"]="#000000"; u["WHITE"]="#FFFFFF"; std::cout<<"Salida de valores por clave:\n";std::cout<<"El HEX del color ROJO es:["<< u["ROJO"]<<"]\n";std::cout<<"El HEX del color NEGRO es:["<< u["BLACK"]<<"]\n";}
Salida:
Iterar e imprimir claves y valores de unordered_map, siendo explícito con el tipo del iterador, n: Clave:[AZUL] Valor:[#0000FF] Clave:[VERDE] Valor:[#00FF00] Clave:[ROJO] Valor:[#FF0000] Iterar e imprimir claves y valores de unordered_map, usando auto: Clave:[AZUL] Valor:[#0000FF] Clave:[VERDE] Valor:[#00FF00] Clave:[ROJO] Valor:[#FF0000] Iterar e imprimir claves y valores usando vínculos estructurados (since C++17): Clave:[AZUL] Valor:[#0000FF] Clave:[VERDE] Valor:[#00FF00] Clave:[ROJO] Valor:[#FF0000] Salida de valores por clave: El HEX del color ROJO es:[#FF0000] El HEX del color NEGRO es:[#000000]