【问题标题】:move objects between containers without copying overhead在容器之间移动对象而不复制开销
【发布时间】:2012-02-11 18:32:38
【问题描述】:

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

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

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

我的问题是如何在不复制开销的情况下将 objVector 中的对象“移动”到 ptrVector 中?

【问题讨论】:

    标签: c++ templates stl containers move


    【解决方案1】:

    简而言之,您不能使用 C++98/C++03。 objVector 中的对象由 objVector 分配和拥有,当你销毁或清除它时,项目也将被销毁。

    使用 C++11,您可以为您的对象实现一个移动构造函数,并用从 objVector 中的对象移动构造的新对象填充 ptrVector。通常,移动构造函数会移动对象的私有成员,避免复制对象拥有的任何大型堆分配数据结构,这通常非常便宜。

    为此,您可以使用std::transform(begin(objVector), end(objVector), std::back_inserter(ptrVector), [](object&amp; o){return new object(std::move(o);}) 之类的东西

    但是,如果 ptrVector 分别拥有它所指向的对象的独占或共享所有权,我建议将 ptrVector 设为 std::vector&lt;std::unique_ptr&lt;object&gt;&gt;std::vector&lt;std::shared_ptr&lt;object&gt;&gt; 而不是使用原始指针。

    【讨论】:

    • 或更好:boost::ptr_container
    【解决方案2】:

    简短的回答 - 你不能。

    ptrVector 包含指针,而不是 object 的实例,因此对象永远不会“在”其中,通过移动它们或其他方式,无论是否有复制开销。

    如果 objVector 本身首先与 vector&lt;object&gt; 的另一个实例交换或(在 C++11 中)移动到另一个 vector&lt;object&gt; 实例,则“在”objVector 中的对象只能在 clear() 被调用之后存活。

    【讨论】:

    • 所以在我们清理 objVector 之前,没有办法将 objVector 中的对象“移动”到堆中并将它们的指针放入 ptrVector 中?
    • @ablimit:好吧,在 C++11 中,移动构造函数可用于在堆上构造对象,或者在 C++03 中,您可以创建一个堆对象,然后将其与向量的元素。这可能比复制便宜,具体取决于object 类,但它仍然是与原始对象不同地址的全新分配。移动/交换整个向量是“释放”对象的唯一方法,而不是创建类似于旧对象的新对象。
    猜你喜欢
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2013-04-08
    • 2013-03-10
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多