Espacios de nombres
Variantes
Acciones

std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::insert_or_assign

De cppreference.com
 
 
 
 
template <class M>
std::pair<iterator, bool> insert_or_assign( const Key& k, M&& obj );
(1) (desde C++17)
template <class M>
std::pair<iterator, bool> insert_or_assign( Key&& k, M&& obj );
(2) (desde C++17)
template <class M>
iterator insert_or_assign( const_iterator hint, const Key& k, M&& obj );
(3) (desde C++17)
template <class M>
iterator insert_or_assign( const_iterator hint, Key&& k, M&& obj );
(4) (desde C++17)
1,3) Si una clave equivalente a k ya existe en el contenedor, asigna std::forward<M>(obj) al mapped_type que corresponde a la clave k. Si la clave no existe, inserta un valor nuevo como si fuera por insert, construyéndolo a partir de value_type(k, std::forward<M>(obj))
2,4) Igual que (1,3), excepto que el valor asociado se construye a partir de value_type(std::move(k), std::forward<M>(obj))

El comportamiento no está definido (hasta C++20)El programa está mal formado (desde C++20) si std::is_assignable_v<mapped_type&, M&&> es false.

Si ocurre una inserción y ocasiona que ocurra una redispersión (rehashing) del contenedor, se invalidan todos los iteradores. De lo contrario no se afectan los iteradores. Las referencias no se invalidan. La dispersión vuelve a ocurrir solo si el nuevo número de elementos es mayor que max_load_factor()*bucket_count().

Contenido

[editar] Parámetros

k - La clave usada tanto para buscar como para insertar si no se encuentra.
hint - Iterador a la posición antes de la cual se insertará el nuevo elemento.
obj - El valor a insertar o asignar.

[editar] Valor de retorno

1,2) El componente bool es true si la inserción tomó lugar y false si la asignación tomó lugar. El componente iterator apunta al elemento que se insertó o actualizó.
3,4) Iterador que apunta al elemento que se insertó o actualizó.

[editar] Complejidad

1,2) La misma que para emplace.
3,4) La misma que para emplace_hint.

[editar] Notas

insert_or_assign devuelve más información que el operador operator[] y no requiere construibilidad por defecto del tipo asociado.

[editar] Ejemplo

#include <iostream>
#include <unordered_map>
#include <string>
 
auto imprimir_nodo = [](const auto &nodo) {
    std::cout << "[" << nodo.first << "] = " << nodo.second << '\n';
};
 
auto imprimir_resultado = [](auto const &par) {
    std::cout << (par.second ? "insertado: " : "asignado:  ");
    imprimir_nodo(*par.first);
};
 
int main()
{
    std::unordered_map<std::string, std::string> miMapa;
 
    imprimir_resultado( miMapa.insert_or_assign("a", "manzana"     ) );
    imprimir_resultado( miMapa.insert_or_assign("b", "banana"      ) );
    imprimir_resultado( miMapa.insert_or_assign("c", "cereza"      ) );
    imprimir_resultado( miMapa.insert_or_assign("c", "mandarina".  ) );
 
    for (const auto &nodo : miMapa) { imprimir_nodo(nodo); }
}

Posible salida:

insertado: [a] = manzana
insertado: [b] = banana
insertado: [c] = cereza
asignado:  [c] = mandarina
[c] = mandarina
[a] = manzana
[b] = banana

[editar] Véase también

Accede o inserta el elemento especificado.
(función miembro pública) [editar]
Accede al elemento especificado con comprobación de límites.
(función miembro pública) [editar]
(C++11)
Inserta elementos o nodos (desde C++17)
(función miembro pública) [editar]
(C++11)
Construye el elemento en el sitio.
(función miembro pública) [editar]