std::map<Key,T,Compare,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.
No se invalidan ni referencias ni iteradores.
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 <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::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);}}
Salida:
insertado: [a] = manzana insertado: [b] = banana insertado: [c] = cereza asignado: [c] = mandarina [a] = manzana [b] = banana [c] = mandarina
[editar]Véase también
Accede o inserta el elemento especificado. (función miembro pública) | |
(C++11) | Accede al elemento especificado con comprobación de límites. (función miembro pública) |
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) |