2012-09-27 17 views
7

Mögliche Duplizieren:
Is there a standard way of moving a range into a vector?C++ 11 bewegen Einfügung für std :: deque oder std :: list

ich recht gut verstehen, wie rvalue Referenzen zu arbeiten, aber ich bin nicht genau, wie sie mit Iteratoren in der STL arbeiten. Hier ist etwas, was ich will:

void insertList(std::list<int>& L, std::list<int>&& R, std::list<int>::iterator insertPoint) 
{ 
    L.insert(insertPoint, R.begin(), R.end()); // want to use move semantics 
} 

Jetzt weiß ich, dass Std :: Liste eine Spleißmethode hat. Aber ich möchte wissen, ob das überhaupt funktionieren kann. Kann es auch für Deque funktionieren?

+3

Abstimmung zum erneuten Öffnen. Während es einen Teil gibt, der mit der Frage geteilt wird, die als doppelt gekennzeichnet ist (zu einem "Deque" wechselnd), gibt es auch einen Teil, der sich sehr von "Liste <>" unterscheidet und für den die Lösung in der verknüpften Frage schlechter ist als der alternative 'splice()' –

Antwort

11

Die splice und die Inhalte der Behälter sind verschiedene Operationen zu bewegen. Im Fall von splice (was nicht mit deque gemacht werden kann) wird der gesamte Knoten von einem Container zum anderen übertragen. Die Knoten befinden sich nicht mehr im ursprünglichen Container und es werden keine Zuweisungen von der Operation ausgeführt.

Die Alternative der Inhalt mit einem Algorithmus ähnlich dem Sie erwähnt, aber unter Verwendung eines bewegen Iterator bewegen:

L.insert(insertPoint, 
     std::make_move_iterator(R.begin()), 
     std::make_move_iterator(R.end())); 

Diese für beide list arbeiten und deque aber die Semantik sind unterschiedlich . Das Einfügen in die neue Liste erfordert die Zuweisung von std::distance(R.begin(),R.end()) Knoten, deren Inhalt durch Verschieben aus dem ursprünglichen Container gefüllt wird. Das reduziert die Kosten für die Erstellung der neuen Knoten, aber sie müssen trotzdem zugewiesen werden. Beachten Sie, dass die alte Liste immer noch alle Knoten enthält, obwohl sie leer sind, da der Inhalt der Daten verschoben wurde.

Im Fall std::list sollten Sie splice bevorzugen, aber das ist nicht auf anderen Containern verfügbar. Bei anderen Containern bleibt der obige Ansatz, bei dem die Kosten für die Erstellung der Containerdatenstruktur zu tragen sind, obwohl die Kosten für die Erstellung der gespeicherten Daten vermieden werden können.

+0

+1 für eine richtige Erklärung geben. ; -] – ildjarn

+0

+1 gute Erklärung über Move-Iteratoren, danke – Walter

Verwandte Themen