Namespaces
Variants

std::map<Key,T,Compare,Allocator>:: operator[]

From cppreference.net

T & operator [ ] ( const Key & key ) ;
(1)
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 value_type ( key, T ( ) ) si la clave no existe.
-
key_type debe cumplir con los requisitos de CopyConstructible .
-
mapped_type debe cumplir con los requisitos de CopyConstructible y DefaultConstructible .
Si se realiza una inserción, el valor mapeado es value-initialized (construido por defecto para tipos clase, inicializado a cero en otros casos) y se devuelve una referencia al mismo.
(until C++11)
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 construye por copia 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 .
(desde C++11)
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 Compare es transparente . Permite llamar a esta función sin construir una instancia de Key .

No se invalidan iteradores ni referencias.

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

Logarítmico en el tamaño del contenedor.

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 mediante 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 emplazar un objeto value_type .

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

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 <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::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);
    // cuenta el número de ocurrencias de cada palabra
    // (la primera llamada a operator[] inicializa el contador con cero)
    std::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:

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'

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 334 C++98 el efecto de la sobrecarga (1) era simplemente retornar
( * ( ( insert ( std:: make_pair ( x, T ( ) ) ) ) . first ) ) . second
proporcionó su propia
descripción en su lugar

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)