簡體   English   中英

c ++ 11移動std :: deque或std :: list的插入

[英]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()));

這適用於listdeque但語義不同。 插入新列表將需要分配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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM