是否可以將矢量內容的所有權從一個矢量轉移到另一個矢量?轉讓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
有拼接功能的列表是可能的。 這應該可以在整個矢量的恆定時間內完成。
如果不是那麼爲什麼不呢?
是否可以將矢量內容的所有權從一個矢量轉移到另一個矢量?轉讓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
有拼接功能的列表是可能的。 這應該可以在整個矢量的恆定時間內完成。
如果不是那麼爲什麼不呢?
你的註釋是完全錯誤的:所有的STL容器都提供了與stdap(b) – 2009-09-23 13:48:44
@Greg具有相同語義的std :: swap(a,b)等價的重載。感謝您在筆記中指出錯誤。在查看Vector.swap的參考時,它們確實具有相同的語義。 – 2009-09-23 14:03:12
的std ::向量具有的作品非常喜歡這樣的交換()函數。
vector<T> v2;
v2.swap(v1);
但是,我的代碼在語法上是錯誤的。 – avakar 2009-09-23 13:43:14
@avakar:你說得對。糾正。 – 2009-09-23 14:03:06
這裏有兩點:
1)對於任何可分配類型,交換可以在分配來定義。這需要三個分配,對於一個容器類型,每個分配在容器的大小上是線性的。從某種意義上說,一個.wap(b)是多餘的。它僅僅爲了提高效率而存在:對於許多容器,例如向量和列表,可以實現交換,使得其運行時複雜度是恆定的而不是線性的。如果對於某些容器類型X可以這樣做,那麼模板專業化交換(X &,X &)可以簡單地按照X :: swap(X &)編寫。這意味着X :: swap(X &)應該僅在存在這樣的恆定時間實現時才被定義。不是每個容器類都需要有這樣一個成員函數,但是如果成員函數完全存在,那麼它肯定會被分攤到不變的時間。
2)如果您需要這對於你想轉讓 擁有更好的效率,請創建一個簡單的複製
側面說明相同的元素另一個容器:「交換」已經被提及。但我想補充一點,在C++ 0x中,您可以簡單地將「OvertakeContents」替換爲「std :: move」,並且它會執行您想要的操作。 – sellibitze 2009-09-23 15:27:25