我相当了解右值引用的工作原理,但我不确定它们如何与 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()));
这对 list
和 deque
都有效,但语义不同。插入到新列表将需要分配 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/