我有一个对象指针的全局向量,我生成相同类型的对象并将它们放入forloop中的向量中。 那就是:
vector<object * > ptrVector;
vector<object > objVector;
for ( ; ;)
{
getElements(objVector);
calcualte_with(objVector);
objVector.clear();
}
我的问题是我如何能够&#34;移动&#34; objVector中的对象进入ptrVector而不复制开销?
答案 0 :(得分:3)
简而言之,你不能用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);})
但是,如果std::vector<std::unique_ptr<object>>
分别拥有对象指向的对象的独占或共享所有权,我建议将ptrVector设为std::vector<std::shared_ptr<object>>
或ptrVector
,而不是使用原始指针。 / p>
答案 1 :(得分:3)
简短回答 - 你不能。
ptrVector
包含指针,而不是object
的实例,因此对象不能通过移动它们或其他方式“进入”它,有或没有复制开销。
“{1}}中的对象只能在向量上调用objVector
之后才能生效clear()
本身第一次交换,或者(在C ++ 11中)移动到另一个objVector
的实例。