std :: map emplace senza valore di copia

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 ++).