Il tipo C ++ 11 std::map
ha una funzione emplace
, come molti altri contenitori.
std::map m; std::string val {"hello"}; m.emplace(1, val);
Questo codice funziona come pubblicizzato, posizionando direttamente la std::pair
, ma si ottiene una copia della key
e della val
.
È ansible inserire il tipo di valore direttamente nella mappa? Possiamo fare meglio che spostare gli argomenti nella chiamata da emplace
?
Ecco un esempio più completo:
struct Foo { Foo(double d, string s) {} Foo(const Foo&) = delete; Foo(Foo&&) = delete; } map m; m.emplace(1, 2.3, string("hello")); // invalid
Gli argomenti passati a map::emplace
vengono inoltrati al costruttore di map::value_type
, che è pair
. In questo modo è ansible utilizzare il costruttore di costruzione a tratti di std::pair
per evitare copie intermedie e spostamenti.
std::map m; m.emplace(std::piecewise_construct, std::forward_as_tuple(1), std::forward_as_tuple(2.3, "hello"));
Dimostrazione dal vivo
In C ++ 17 questo può essere ottenuto più facilmente con il metodo try_emplace
.
map m; m.try_emplace(1, 2.3, "hello");
Questa aggiunta alla libreria standard era coperta nel documento N4279 e dovrebbe essere già supportata in Visual Studio 2015 , GCC 6.1 e LLVM 3.7 (la libreria libc ++).