std::map<Key,T,Compare,Allocator>::insert_or_assign
De cppreference.com
<tbody>
</tbody>
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.
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. |
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ó.
Complejidad
1,2) La misma que para
emplace.3,4) La misma que para
emplace_hint.Notas
insert_or_assign devuelve más información que el operador operator[] y no requiere construibilidad por defecto del tipo asociado.
Ejemplo
Ejecuta este código
#include <iostream>
#include <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::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); }
}
Salida:
insertado: [a] = manzana
insertado: [b] = banana
insertado: [c] = cereza
asignado: [c] = mandarina
[a] = manzana
[b] = banana
[c] = mandarina
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) |