std::unordered_map<Key,T,Hash,KeyEqual,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(k), 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)), 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(k), 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)), std::forward_as_tuple(std::forward<Args>(args)...))
Si ocurre una redispersión (rehashing) debido a la inserción, 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().
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. |
Valor de retorno
emplaceemplace_hintComplejidad
emplaceemplace_hintNotas
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::unordered_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).
Ejemplo
#include <iostream>
#include <utility>
#include <string>
#include <unordered_map>
auto imprimir_nodo = [](const auto &nodo) {
std::cout << "[" << nodo.first << "] = " << nodo.second << '\n';
};
auto imprimir_resultado = [](auto const &pair) {
std::cout << (pair.second ? "insertado: " : "ignorado: ");
imprimir_nodo(*pair.first);
};
int main()
{
using namespace std::literals;
std::unordered_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 (const auto &p : m) { imprimir_nodo(p); }
}
Posible salida:
insertado: [a] = a
insertado: [b] = abcd
insertado: [c] = cccccccccc
ignorado: [c] = cccccccccc
[a] = a
[b] = abcd
[c] = cccccccccc
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) |
(C++11) |
Inserta elementos o nodos (desde C++17) (función miembro pública) |