std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::insert_or_assign
De cppreference.com
< cpp | container | unordered map
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
Ejecuta este código
#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) |
Accede al elemento especificado con comprobación de límites. (función miembro pública) | |
(C++11) | Inserta elementos o nodos(desde C++17) (función miembro pública) |
(C++11) | Construye el elemento en el sitio. (función miembro pública) |