繁体   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