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 =[](constauto&nodo){std::cout<<"["<< nodo.first<<"] = "<< nodo.second<<'\n';};   auto imprimir_resultado =[](autoconst&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(constauto&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

(C++11)
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]
close