2009-09-23 14 views
5

Czy można przenieść własność zawartości wektorowej z jednego wektora na inny?Przenosić własność w kontenerach STL?

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

Jest to możliwe w przypadku list z funkcją splotu. To powinno być możliwe w stałym czasie dla całego wektora.

Jeśli nie, to dlaczego nie?

+2

marginesie: „Swap” zostało już wspomniane. Ale chciałbym dodać, że w C++ 0x możesz po prostu zamienić "OvertakeContents" na "std :: move" i zrobi to, co chcesz. – sellibitze

Odpowiedz

10

Wyjazd std :: Swap

vector<T> v1; 
// fill v1 

vector<T> v2; 

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

Swap Reference

+1

Twoja notatka jest całkowicie fałszywa: wszystkie pojemniki STL zapewniają równoważne przeciążenie std :: swap (a, b) z tą samą semantyką co a.swap (b) –

+0

@Greg. Dziękuję za wskazanie błędu w mojej notatce. Patrząc na odniesienie do Vector.swap, rzeczywiście mają tę samą semantykę. –

10

std :: vector posiada funkcję zamiany(), który działa prawie jak ten.

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

Prawie wznowiłem, ale twój kod jest nieprawidłowy pod względem składni. – avakar

+0

@avakar: Masz rację. Poprawione. –

0

tutaj dwa punkty:

1) dla każdego typu przypisywany wymiany może być zdefiniowana w odniesieniu do przeniesienia. Wymaga to trzech przydziałów, z których każdy dla typu kontenera jest liniowy w rozmiarze kontenera. W pewnym sensie, a.swap (b) jest zbędny. Istnieje tylko ze względu na wydajność: w przypadku wielu kontenerów, takich jak wektor i lista, możliwe jest zaimplementowanie zamiany w taki sposób, że jej złożoność w czasie wykonywania jest stała, a nie liniowa. Jeśli jest to możliwe dla jakiegoś kontenera typu X, to zamiana specjalizacji szablonów (X &, X &) może być po prostu zapisana pod względem X :: swap (X &). Implikacją tego jest to, że X :: swap (X &) powinien być zdefiniowany tylko wtedy, gdy istnieje taka implementacja o stałej długości czasu. Nie każda klasa kontenerowa X musi mieć taką funkcję składową, ale jeśli funkcja składowa istnieje w ogóle, wówczas gwarantuje się, że będzie ona amortyzowana stałym czasem.

2) Jeśli potrzebujesz inny pojemnik, który ma te same elementy, dla których chcieli przenieść własności Proszę utworzyć prostą kopię dla lepszej wydajności