[英]c++11 move insertion for std::deque or std::list
我理解rvalue引用是如何工作的,但我不確定它們如何與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有一個splice方法。 但我想知道這是否可行。 它也可以用於deque嗎?
splice
和移動容器的內容是不同的操作。 在splice
(無法使用deque
)的情況下,整個節點從一個容器轉移到另一個容器。 節點將不再位於原始容器中,並且操作不會執行任何分配。
使用類似於您所述的算法移動內容的替代方法,但使用移動迭代器:
L.insert(insertPoint,
std::make_move_iterator(R.begin()),
std::make_move_iterator(R.end()));
這適用於list
和deque
但語義不同。 插入新列表將需要分配std::distance(R.begin(),R.end())
節點,其內容將通過從原始容器移動來填充。 這降低了創建新節點的成本,但仍然需要進行分配。 請注意,舊列表仍將包含所有節點,但在移動數據內容時它們將為空 。
在std::list
的情況下,您應該更喜歡splice
,但這在其他容器上不可用。 對於其他容器,您將留下上述方法,其中必須采用構建容器數據結構的成本,盡管可以避免創建存儲數據的成本。
你想要std::make_move_iterator()
:
L.insert(
insertPoint,
std::make_move_iterator(R.begin()),
std::make_move_iterator(R.end())
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.