[英]move objects between containers without copying overhead
我有一个对象指针的全局向量,我正在生成相同类型的对象,并将它们放入forloop内的向量中。 那是:
vector<object * > ptrVector;
vector<object > objVector;
for ( ; ;)
{
getElements(objVector);
calcualte_with(objVector);
objVector.clear();
}
我的问题是如何在不复制开销的情况下将objVector中的对象“移动”到ptrVector中?
简而言之,你不能用C ++ 98 / C ++ 03。 objVector中的对象由objVector分配和拥有,当您破坏或清除它时,项目也将被破坏。
使用C ++ 11,您可以为对象实现移动构造函数,并使用从objVector中的对象移动构造的新对象填充ptrVector。 通常,移动构造函数移动对象的私有成员,避免对象拥有的任何大型堆分配数据结构的副本,这通常非常便宜。
要做到这一点,你可以使用类似std::transform(begin(objVector), end(objVector), std::back_inserter(ptrVector), [](object& o){return new object(std::move(o);})
但是,如果ptrVector
具有独占或共享所有权,我建议将ptrVector设为std::vector<std::unique_ptr<object>>
或std::vector<std::shared_ptr<object>>
而不是使用原始指针。它分别指向的对象。
简短的回答 - 你不能。
ptrVector
包含指针,而不是object
实例,因此对象不能通过移动它们或其他方式“进入”它,有或没有复制开销。
如果首先交换objVector
本身或者(在C ++ 11中)移动到vector<object>
另一个实例,那么“in” objVector
对象只能在向量上调用clear()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.