rlb*_*ond 9 c++ rvalue-reference move-semantics c++11
我理解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
}
Run Code Online (Sandbox Code Playgroud)
现在我知道std :: list有一个splice方法.但我想知道这是否可行.它也可以用于deque吗?
Dav*_*eas 13
在splice与移动的容器中的内容是不同的操作.在splice(不能用deque)的情况下,整个节点从一个容器转移到另一个容器.节点将不再位于原始容器中,并且操作不会执行任何分配.
使用类似于您所述的算法移动内容的替代方法,但使用移动迭代器:
L.insert(insertPoint,
std::make_move_iterator(R.begin()),
std::make_move_iterator(R.end()));
Run Code Online (Sandbox Code Playgroud)
这对两者都有效list,deque但语义不同.插入新列表将需要分配std::distance(R.begin(),R.end())节点,其内容将通过从原始容器移动来填充.这降低了创建新节点的成本,但仍然需要进行分配.请注意,旧列表仍将包含所有节点,但在移动数据内容时它们将为空.
在std::list您应该更喜欢的情况下splice,但在其他容器上不可用.对于其他容器,您将留下上述方法,其中必须采用构建容器数据结构的成本,尽管可以避免创建存储数据的成本.
L.insert(
insertPoint,
std::make_move_iterator(R.begin()),
std::make_move_iterator(R.end())
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2535 次 |
| 最近记录: |