c++ - std:: mapa emplace sin copiar valor
c++11 dictionary (2)
En C ++ 17 esto se puede lograr más fácilmente con el método
try_emplace
.
map<int,Foo> m;
m.try_emplace(1, 2.3, "hello");
Esta adición a la biblioteca estándar se cubrió en el papel N4279 y ya debería ser compatible con Visual Studio 2015 , GCC 6.1 y LLVM 3.7 (la biblioteca libc ++).
El tipo C ++ 11
std::map<K,V>
tiene una función de
emplace
, al igual que muchos otros contenedores.
std::map<int,std::string> m;
std::string val {"hello"};
m.emplace(1, val);
Este código funciona como se anuncia, ubicando el
std::pair<K,V>
directamente, sin embargo resulta en una copia de
key
y
val
.
¿Es posible colocar el tipo de valor directamente en el mapa también?
¿Podemos hacerlo mejor que mover los argumentos en la llamada al
emplace
?
Aquí hay un ejemplo más completo:
struct Foo
{
Foo(double d, string s) {}
Foo(const Foo&) = delete;
Foo(Foo&&) = delete;
}
map<int,Foo> m;
m.emplace(1, 2.3, string("hello")); // invalid
Los argumentos que pasa a
map::emplace
se envían al constructor de
map::value_type
, que es
pair<const Key, Value>
.
Por lo tanto, puede usar el
constructor de construcción por partes
de
std::pair
para evitar copias intermedias y movimientos.
std::map<int, Foo> m;
m.emplace(std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(2.3, "hello"));