2009-09-23 87 views
5

是否可以將矢量內容的所有權從一個矢量轉移到另一個矢量?轉讓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 

有拼接功能的列表是可能的。 這應該可以在整個矢量的恆定時間內完成。

如果不是那麼爲什麼不呢?

+2

側面說明相同的元素另一個容器:「交換」已經被提及。但我想補充一點,在C++ 0x中,您可以簡單地將「OvertakeContents」替換爲「std :: move」,並且它會執行您想要的操作。 – sellibitze 2009-09-23 15:27:25

回答

10

退房化std :: swap

vector<T> v1; 
// fill v1 

vector<T> v2; 

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

Swap Reference

+1

你的註釋是完全錯誤的:所有的STL容器都提供了與stdap(b) – 2009-09-23 13:48:44

+0

@Greg具有相同語義的std :: swap(a,b)等價的重載。感謝您在筆記中指出錯誤。在查看Vector.swap的參考時,它們確實具有相同的語義。 – 2009-09-23 14:03:12

10

的std ::向量具有的作品非常喜歡這樣的交換()函數。

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

但是,我的代碼在語法上是錯誤的。 – avakar 2009-09-23 13:43:14

+0

@avakar:你說得對。糾正。 – 2009-09-23 14:03:06

0

這裏有兩點:

1)對於任何可分配類型,交換可以在分配來定義。這需要三個分配,對於一個容器類型,每個分配在容器的大小上是線性的。從某種意義上說,一個.wap(b)是多餘的。它僅僅爲了提高效率而存在:對於許多容器,例如向量和列表,可以實現交換,使得其運行時複雜度是恆定的而不是線性的。如果對於某些容器類型X可以這樣做,那麼模板專業化交換(X &,X &)可以簡單地按照X :: swap(X &)編寫。這意味着X :: swap(X &)應該僅在存在這樣的恆定時間實現時才被定義。不是每個容器類都需要有這樣一個成員函數,但是如果成員函數完全存在,那麼它肯定會被分攤到不變的時間。

2)如果您需要這對於你想轉讓 擁有更好的效率,請創建一個簡單的複製