2015-01-15 11 views
33

Der C++ 11 std::map<K,V> Typ hat eine emplace Funktion, wie viele andere Container.Std :: Karte Platzieren ohne Kopieren Wert

std::map<int,std::string> m; 

std::string val {"hello"}; 

m.emplace(1, val); 

Dieser Code funktioniert wie beworben, direkt die std::pair<K,V> emplacing, jedoch ergibt sich eine Kopie von key und val stattfindet.

Kann der Wertetyp auch direkt in die Karte eingefügt werden? Können wir es besser machen, als die Argumente im Aufruf an emplace zu verschieben?


Hier ist ein gründlicheres Beispiel:

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 
+0

@ Cheersandthth.-Alf, ich habe eine Reihe von Dokumenten gelesen und komme zu dem Schluss, dass es nicht möglich ist. Allerdings bin ich nicht der erfahrenste C++ - Entwickler, also wollte ich ihn an einigen der Gurus vorbeiführen, in der Hoffnung, dass ich falsch liege. Kannst du helfen? –

+0

okay, lesen Sie http://en.cppreference.com/w/cpp/container/map/emplace –

+3

Meinst du eine * extra * Kopie? "val" ist ein Lvalue, also muss irgendwann eine Kopie erstellt werden. – juanchopanza

Antwort

49

Die Argumente, die Sie zu map::emplace passieren an den Konstruktor map::value_type leitet werden, die pair<const Key, Value> ist. So können Sie die piecewise construction constructor von std::pair verwenden, um Zwischenkopien und Verschiebungen zu vermeiden.

std::map<int, Foo> m; 

m.emplace(std::piecewise_construct, 
      std::forward_as_tuple(1), 
      std::forward_as_tuple(2.3, "hello")); 

Live demo

+1

Vielen Dank. Das sieht genau nach der Form aus, über die ich lernen musste. –

6

In C++ 17 Diese können leichter mit dem try_emplace Verfahren erreicht werden.

map<int,Foo> m; 
m.try_emplace(1, 2.3, "hello"); 

Dieser Zusatz zur Standardbibliothek wurde in paper N4279 abgedeckt und bereits in Visual Studio 2015, GCC 6.1 und LLVM 3.7 (die libC++ Bibliothek) unterstützt werden soll.

Verwandte Themen