c++11 为 std::deque 或 std::list move 插入

标签 c++ c++11 rvalue-reference move-semantics

我相当了解右值引用的工作原理,但我不确定它们如何与 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 方法。但我想知道这是否可行。它也适用于双端队列吗?

最佳答案

拼接 move 容器的内容是不同的操作。在 splice 的情况下(不能用 deque 完成),整个节点从一个容器转移到另一个容器。节点将不再位于原始容器中,操作也不会执行任何分配。

move 内容的替代方法与您所说的算法类似,但使用 move 迭代器:

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

这对 listdeque 都有效,但语义不同。插入到新列表将需要分配 std::distance(R.begin(),R.end()) 节点,其内容将通过从原始容器 move 来填充.这降低了创建新节点的成本,但仍然需要分配它们。请注意,旧列表仍将包含所有节点,尽管它们将是,因为数据内容已被 move 。

std::list 的情况下,您应该更喜欢 splice,但这在其他容器上不可用。对于其他容器,您将只能使用上述方法,其中必须承担构建容器数据结构的成本,尽管可以避免创建存储数据的成本。

关于c++11 为 std::deque 或 std::list move 插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12630241/

相关文章:

c++ - 将指针类参数复制到类成员的好处?

c++ - 使用外部条件修改序列操作

c++ - 专用于私有(private)成员类的 std::hash

c++ - std::move 堆栈对象(到不同的线程)

时间:2019-05-06 标签:c++unique_ptr参数传递

c++ - 右值引用是否有reference_wrapper<>?

c++ - 让赋值运算符作用于声明

c++ - 这段代码线程安全吗?如果不是什么时候以及怎么会出错?

c++ - std::unique_ptr 和模板

c++ - 如何避免相似模板中的代码重复