Namespaces
Variants

std::unordered_map<Key,T,Hash,KeyEqual,Allocator>:: operator[]

From cppreference.net

T & operator [ ] ( const Key & key ) ;
(1) (desde C++11)
T & operator [ ] ( Key && key ) ;
(2) (desde C++11)
template < class K >
T & operator [ ] ( K && x ) ;
(3) (desde C++26)

Devuelve una referencia al valor que está mapeado a una clave equivalente a key o x respectivamente, realizando una inserción si dicha clave no existe previamente.

1) Inserta un objeto value_type construido in situ a partir de std:: piecewise_construct , std:: forward_as_tuple ( key ) , std:: tuple <> ( ) si la clave no existe.
Equivalente a return this - > try_emplace ( key ) . first - > second ; . (desde C++17) Cuando se utiliza el asignador por defecto, esto resulta en que la clave se copia construye desde key y el valor mapeado es inicializado por valor .
-
value_type debe ser EmplaceConstructible desde std:: piecewise_construct , std:: forward_as_tuple ( key ) , std:: tuple <> ( ) . Cuando se utiliza el asignador por defecto, esto significa que key_type debe ser CopyConstructible y mapped_type debe ser DefaultConstructible .
2) Inserta un objeto value_type construido in-situ a partir de std:: piecewise_construct , std:: forward_as_tuple ( std :: move ( key ) ) , std:: tuple <> ( ) si la clave no existe.
Equivalente a return this - > try_emplace ( std :: move ( key ) ) . first - > second ; . (desde C++17)
Cuando se utiliza el asignador por defecto, esto resulta en que la clave se construye por movimiento desde key y el valor mapeado es inicializado por valor .
-
value_type debe ser EmplaceConstructible desde std:: piecewise_construct , std:: forward_as_tuple ( std :: move ( key ) ) , std:: tuple <> ( ) . Cuando se utiliza el asignador por defecto, esto significa que key_type debe ser MoveConstructible y mapped_type debe ser DefaultConstructible .
3) Inserta un objeto value_type construido in-situ si no existe ninguna clave que compare transparentemente equivalente al valor x .
Equivalente a return this - > try_emplace ( std:: forward < K > ( x ) ) . first - > second ; . Esta sobrecarga participa en la resolución de sobrecarga solo si Hash y KeyEqual son ambos transparentes . Esto asume que dicho Hash puede ser invocado tanto con el tipo K como con el tipo Key , y que el KeyEqual es transparente, lo que, en conjunto, permite llamar a esta función sin construir una instancia de Key .

Si después de la operación el nuevo número de elementos es mayor que el antiguo max_load_factor() * bucket_count() se produce una redistribución.
Si ocurre redistribución (debido a la inserción), todos los iteradores quedan invalidados. En caso contrario (sin redistribución), los iteradores no se invalidan.

Contenidos

Parámetros

key - la clave del elemento a buscar
x - un valor de cualquier tipo que puede compararse transparentemente con una clave

Valor de retorno

1,2) Una referencia al valor mapeado del nuevo elemento si no existía ningún elemento con la clave key . De lo contrario, una referencia al valor mapeado del elemento existente cuya clave es equivalente a key .
3) Una referencia al valor mapeado del nuevo elemento si no existía ningún elemento con clave que compare equivalente al valor x . De lo contrario, una referencia al valor mapeado del elemento existente cuya clave compara equivalente a x .

Excepciones

Si se lanza una excepción por cualquier operación, la inserción no tiene efecto.

Complejidad

Caso promedio: constante, caso peor: lineal en tamaño.

Notas

En los estándares publicados de C++11 y C++14, esta función se especificaba como requerir que mapped_type fuera DefaultInsertable y que key_type fuera CopyInsertable o MoveInsertable en * this . Esta especificación era defectuosa y fue corregida por LWG issue 2469 , y la descripción anterior incorpora la resolución de ese issue.

Sin embargo, se sabe que una implementación (libc++) construye los objetos key_type y mapped_type mediante dos llamadas separadas al allocator construct() , como posiblemente requieren los estándares publicados, en lugar de emplacear un objeto value_type .

operator [ ] no es constante porque inserta la clave si no existe. Si este comportamiento no es deseable o si el contenedor es const , at puede ser utilizado.

insert_or_assign devuelve más información que operator [ ] y no requiere que el tipo mapeado sea construible por defecto.

(desde C++17)
Macro de prueba de características Valor Std Característica
__cpp_lib_associative_heterogeneous_insertion 202311L (C++26) Sobrecargas heterogéneas para las funciones miembro restantes en contenedores asociativos ordenados y contenedores asociativos no ordenados . ( 3 )

Ejemplo

#include <iostream>
#include <string>
#include <unordered_map>
void println(auto const comment, auto const& map)
{
    std::cout << comment << '{';
    for (const auto& pair : map)
        std::cout << '{' << pair.first << ": " << pair.second << '}';
    std::cout << "}\n";
}
int main()
{
    std::unordered_map<char, int> letter_counts{{'a', 27}, {'b', 3}, {'c', 1}};
    println("letter_counts initially contains: ", letter_counts);
    letter_counts['b'] = 42; // actualiza un valor existente
    letter_counts['x'] = 9;  // inserta un nuevo valor
    println("after modifications it contains: ", letter_counts);
    // contar el número de ocurrencias de cada palabra
    // (la primera llamada a operator[] inicializa el contador con cero)
    std::unordered_map<std::string, int>  word_map;
    for (const auto& w : {"this", "sentence", "is", "not", "a", "sentence",
                          "this", "sentence", "is", "a", "hoax"})
        ++word_map[w];
    word_map["that"]; // simplemente inserta el par {"that", 0}
    for (const auto& [word, count] : word_map)
        std::cout << count << " occurrence(s) of word '" << word << "'\n";
}

Salida posible:

letter_counts initially contains: {{a: 27}{b: 3}{c: 1}}
after modifications it contains: {{a: 27}{b: 42}{c: 1}{x: 9}}
2 occurrence(s) of word 'a'
1 occurrence(s) of word 'hoax'
2 occurrence(s) of word 'is'
1 occurrence(s) of word 'not'
3 occurrence(s) of word 'sentence'
0 occurrence(s) of word 'that'
2 occurrence(s) of word 'this'

Véase también

accede al elemento especificado con verificación de límites
(función miembro pública)
inserta un elemento o asigna al elemento actual si la clave ya existe
(función miembro pública)
inserta in situ si la clave no existe, no hace nada si la clave existe
(función miembro pública)