2009-09-23 7 views
5

Ist es möglich, den Besitz eines Vektorinhalts von einem Vektor auf einen anderen zu übertragen?Eigentum in STL-Containern übertragen?

vector<T> v1; 
// fill v1 
vector<T> v2 = OvertakeContents(v1); 
// now v1 would be empty and v2 would have all the contents of v1 

Es ist möglich für Listen mit Spleißfunktion. Dies sollte in konstanter Zeit auch für den ganzen Vektor möglich sein.

Wenn nicht, warum nicht?

+2

Randnotiz übertragen wollte: „swap“ wurde bereits erwähnt. Aber ich möchte hinzufügen, dass Sie in C++ 0x einfach "OvertakeContents" durch "std :: move" ersetzen können und es wird tun, was Sie wollen. – sellibitze

Antwort

10

Check out std :: Swap

vector<T> v1; 
// fill v1 

vector<T> v2; 

swap(v1, v2); 
OR 
v2.swap(v1); 

Swap Reference

+1

Ihre Anmerkung ist vollständig falsch: Alle STL-Container bieten eine äquivalente Überladung von std :: swap (a, b) mit der gleichen Semantik wie a.swap (b) –

+0

@Greg. Danke, dass Sie auf den Fehler in meiner Notiz hingewiesen haben. Beim Betrachten der Referenz für Vector.swap haben sie tatsächlich die gleiche Semantik. –

10

std :: vector hat eine Funktion swap(), die ziemlich genau wie das funktioniert.

vector<T> v2; 
v2.swap(v1); 
+0

Ich habe Sie fast upgestimmt, aber Ihr Code ist syntaktisch falsch. – avakar

+0

@avakar: Du hast Recht. Korrigiert. –

0

Hier gibt es zwei Punkte:

1) Für jede zuweisbare Typ, tauschen können in Bezug auf die Zuordnung definiert werden. Dies erfordert drei Zuweisungen, von denen jede für einen Containertyp in der Containergröße linear ist. In gewisser Hinsicht ist a.swap (b) überflüssig. Es existiert nur aus Gründen der Effizienz: für viele Container, wie Vektor und Liste, ist es möglich, Swap so zu implementieren, dass seine Laufzeitkomplexität eher konstant als linear ist. Wenn dies für einige Container-Typ X möglich ist, dann ist die Template-Spezialisierung swap (X &, X &) einfach in Bezug auf die X :: Swap geschrieben werden (X &). Die Implikation davon ist, dass X :: swap (X &) nur definiert werden sollte, wenn eine solche Konstantenzeit-Implementierung existiert. Nicht jede Containerklasse X muss eine solche Memberfunktion haben, aber wenn die Memberfunktion überhaupt existiert, ist garantiert, dass sie konstante Zeit amortisiert.

2), wenn Sie einen anderen Container müssen die gleichen Elemente, für die hat Sie Eigentum Bitte erstellen Sie eine einfache Kopie für eine bessere Effizienz