2017-02-16 2 views
0

I C relativly bin neu ++ und dies könnte eine dumme Frage, aber ich versuche rValue und lValue Referenzen im Moment zu verstehen, und das kam mir in den Sinn:C++ Karte kopieren mit std vector :: bewegen

Nehmen wir an, wir haben eine Karte (die aus einer Datenbank oder was auch immer kommt) und wir wollen alle Werte davon in einen Vektor kopieren.

void insertItems(std::vector<std::string>& v) 
{ 
    std::map<int, std::string> names = loadFromDb(); 

    for (auto& kv : names) 
    { 
     v.push_back(std::move(kv.second)); 
    } 
} 

Ist es richtig, std::move hier zu verwenden? std::string bietet einen Move-Konstruktor und (möglicherweise nicht für String, aber für größere Objekte) ist der Move-Konstruktor viel schneller als der Copy-Konstruktor. Wir wissen auch, dass wir die Elemente der Karte nicht woanders verwenden und dass sie außerhalb des Gültigkeitsbereichs liegen, sobald wir die Funktion verlassen. So ist meine Vermutung richtig?

Ich kann keinen Widerspruch in meinen Gedanken sehen, aber es ist ein kompliziertes Thema und ich habe Angst etwas zu verpassen. S.S .: Ich denke, der Name der Frage ist nicht der beste. Wenn Sie einen besseren haben, können Sie ihn gerne bearbeiten.

+3

Die Implementierung ist korrekt. Eine 'v.reserve' ist eine andere Optimierung zu tun. – Jarod42

+1

Oh, und bedenke, dass 'v' kein Zeiger ist. –

+0

Oh ja danke, du hast absolut recht. Ich habe das korrigiert – Cilenco

Antwort

5

Ist es richtig, std::move hier zu verwenden?

Wenn Sie sicher sind, dass Sie in Zukunft nicht auf die verschobenen Werte zugreifen werden, ja.


Sie möchten vielleicht auch std::vector::reserve verwenden, um den Platzbedarf in v vorzubelegen.

v.reserve(v.size() + names.size()); 
+2

Ich denke, du meinst 'v.reserve (v.size() + names.size());' da 'v' anfangs möglicherweise nicht leer ist. – emlai

+0

@tuple_cat: guter Punkt, danke! –

+0

Wenn ich 'reserve' nicht jedes Mal benutze, wenn ich neue Werte einfüge, wird eine Kopie des Vektors erstellt? – Cilenco

3

Ist es richtig, std::move hier zu verwenden?

Ja. Der Code sieht gut aus.

1

In dem Fall, dass Sie dann zeigen, wird ja die Verschiebung in Ordnung sein, da Sie die Karte oder ihre Werte später nicht verwenden werden.

Wenn die Map kein Wert war (wie wenn es eine Referenz wäre), oder Sie die Werte später verwenden müssen, dann ist es falsch.

Verwandte Themen