c++ c++11 dictionary stl emplace

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"));

Demo en vivo