std::map<Key,T,Compare,Allocator>::try_emplace
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.
k
ya existe en el contenedor, no hace nada. De lo contrario, se comporta como emplace
excepto que el elemento se construye comovalue_type(std::piecewise_construct,
std::forward_as_tuple(std::forward<Args>(args)...))
k
ya existe en el contenedor, no hace nada. De lo contrario, se comporta como emplace
excepto que el elemento se construye comovalue_type(std::piecewise_construct,
std::forward_as_tuple(std::move(k)),
k
ya existe en el contenedor, no hace nada. De lo contrario, se comporta como emplace_hint
excepto que el elemento se construye comovalue_type(std::piecewise_construct,
std::forward_as_tuple(std::forward<Args>(args)...))
k
ya existe en el contenedor, no hace nada. De lo contrario, se comporta como emplace_hint
excepto que el elemento se construye comovalue_type(std::piecewise_construct,
std::forward_as_tuple(std::move(k)),
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
emplace
emplace_hint
[editar]Complejidad
emplace
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) |
(C++11) | Construye elementos en el sitio utilizando una pista. (función miembro pública) |
Inserta elementos o nodos(desde C++17) (función miembro pública) |