在容器之间移动对象而不复制开销

时间:2012-02-11 18:32:38

标签: c++ templates stl containers move

我有一个对象指针的全局向量,我生成相同类型的对象并将它们放入forloop中的向量中。 那就是:

vector<object * > ptrVector;
vector<object > objVector;

for ( ; ;)
{
    getElements(objVector);
    calcualte_with(objVector);
    objVector.clear();
}

我的问题是我如何能够&#34;移动&#34; objVector中的对象进入ptrVector而不复制开销?

2 个答案:

答案 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的实例。