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.
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()' –