Espacios de nombres
Variantes
Acciones

std::map<Key,T,Compare,Allocator>::try_emplace

De cppreference.com
< cpp‎ | container‎ | map
 
 
 
 
template<class... Args>
pair<iterator, bool> try_emplace(const Key& k, Args&&... args);
(1) (desde C++17)
template<class... Args>
pair<iterator, bool> try_emplace( Key&& k, Args&&... args);
(2) (desde C++17)
template<class... Args>
iterator try_emplace( const_iterator hint, const Key& k, Args&&... args);
(3) (desde C++17)
template<class... Args>
iterator try_emplace( const_iterator hint, Key&& k, Args&&... args);
(4) (desde C++17)

Inserta un nuevo elemento en el contenedor con la clave k y el valor construido con args, si no hay ningún elemento con tal clave en el contenedor.

1) Si una clave equivalente a k ya existe en el contenedor, no hace nada. De lo contrario, se comporta como emplace excepto que el elemento se construye como
value_type(std::piecewise_construct,

           std::forward_as_tuple(k),

           std::forward_as_tuple(std::forward<Args>(args)...))
2) Si una clave equivalente a k ya existe en el contenedor, no hace nada. De lo contrario, se comporta como emplace excepto que el elemento se construye como
value_type(std::piecewise_construct,

           std::forward_as_tuple(std::move(k)),

           std::forward_as_tuple(std::forward<Args>(args)...))
3) Si una clave equivalente a k ya existe en el contenedor, no hace nada. De lo contrario, se comporta como emplace_hint excepto que el elemento se construye como
value_type(std::piecewise_construct,

           std::forward_as_tuple(k),

           std::forward_as_tuple(std::forward<Args>(args)...))
4) Si una clave equivalente a k ya existe en el contenedor, no hace nada. De lo contrario, se comporta como emplace_hint excepto que el elemento se construye como
value_type(std::piecewise_construct,

           std::forward_as_tuple(std::move(k)),

           std::forward_as_tuple(std::forward<Args>(args)...))

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 - Un iterador a la posición antes de la cual se insertará el nuevo elemento.
args - Los argumentos a reenviar al constructor del elemento.

[editar]Valor de retorno

1,2) Igual que para emplace
3,4) Igual que para emplace_hint

[editar]Complejidad

1,2) Igual que para emplace
3,4) Igual que para emplace_hint

[editar]Notas

A diferencia de insert o emplace, estas funciones no se mueven de los argumentos r-valor si la inserción no ocurre, lo que facilita la manipulación de mapas cuyos valores son tipos de solo movimiento, tales como std::map<std::string, std::unique_ptr<foo>>. Además, try_emplace trata la clave y los argumentos al tipo mapped_type de manera separada, a diferencia de emplace, que requiere que los argumentos construyan un value_type (es decir, un std::pair).

[editar]Ejemplo

#include <iostream>#include <utility>#include <string>   #include <map>   auto imprimir_nodo =[](constauto&nodo){std::cout<<"["<< nodo.first<<"] = "<< nodo.second<<'\n';};   auto imprimir_resultado =[](autoconst&pair){std::cout<<(pair.second?"insertado: ":"ignorado: "); imprimir_nodo(*pair.first);};   int main(){usingnamespace std::literals;std::map<std::string, std::string> m;   imprimir_resultado( m.try_emplace("a", "a"s)); imprimir_resultado( m.try_emplace("b", "abcd")); imprimir_resultado( m.try_emplace("c", 10, 'c')); imprimir_resultado( m.try_emplace("c", "No será insertado"));   for(constauto&p : m){ imprimir_nodo(p);}}

Salida:

insertado: [a] = a insertado: [b] = abcd insertado: [c] = cccccccccc ignorado: [c] = cccccccccc [a] = a [b] = abcd [c] = cccccccccc

[editar]Véase también

(C++11)
Construye el elemento en el sitio.
(función miembro pública)[editar]
Construye elementos en el sitio utilizando una pista.
(función miembro pública)[editar]
Inserta elementos o nodos(desde C++17)
(función miembro pública)[editar]
close