2012-09-27 77 views
7

可能重複:
Is there a standard way of moving a range into a vector?C++ 11移動插入性病:: deque的或std ::列表

我明白了相當不錯的參考是如何工作的右值,但我不完全確定他們如何與STL中的迭代器一起工作。這是我想要的東西:

void insertList(std::list<int>& L, std::list<int>&& R, std::list<int>::iterator insertPoint) 
{ 
    L.insert(insertPoint, R.begin(), R.end()); // want to use move semantics 
} 

現在我知道std :: list有一個拼接方法。但我想知道這是否可以工作。它也可以用於Deque嗎?

+3

投票重新打開。雖然有一部分與標記爲重複的問題共享(移至'deque'),但也有一部分與list <>'非常不同,並且鏈接問題中的解決方案比替代'splice()' –

回答

11

splice移動容器的內容是不同的操作。在splice(不能用deque完成)的情況下,整個節點從一個容器轉移到另一個容器。節點將不再位於原始容器中,操作也不會執行分配。

移動內容類似於你所說的一個算法,但使用移動迭代器的選擇:

L.insert(insertPoint, 
     std::make_move_iterator(R.begin()), 
     std::make_move_iterator(R.end())); 

這兩個listdeque,但語義不同工作。插入新列表需要分配std::distance(R.begin(),R.end())節點,其內容將通過從原始容器移動來填充。這降低了創建新節點的成本,但仍然需要分配。請注意,舊列表仍將包含所有節點,但由於數據內容已被移動,它們將爲

std::list的情況下,您應該更喜歡splice,但這不適用於其他容器。對於其他容器,您將留下上面的方法,即構建容器數據結構的成本必須被採用,儘管可以避免創建存儲數據的成本。

+0

+1給出正確的解釋。 ; - ] – ildjarn

+0

+1關於移動迭代器的很好的解釋,謝謝 – Walter