代码之家  ›  专栏  ›  技术社区  ›  Remi.b

保持原始对象的同时移动

  •  -1
  • Remi.b  · 技术社区  · 7 年前
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
        vector<double> a = {1.0,2.1,3.3};
        vector<double> b = {5.8};
    
        // Do stuff ...
    
        b = move(a);
    
        cout << "a.size() = " << a.size() << "\n";
        cout << "b.size() = " << b.size() << "\n";
    
        return 0;
    }
    

    输出

    a.size() = 0
    b.size() = 3
    

    我理解这个输出,但我希望 a 仍将指向相同的原始数据。如何“移动” b (避免浪费时间进行复制),同时能够同时使用 b 好像其中一个是另一个的参考?我不能使用引用,因为它必须更改引用的内容。

    我可以用指针

    int main()
    {
        vector<double>* a = new vector<double>;
        vector<double>* b = new vector<double>;
        a->push_back(1.0);
        a->push_back(2.1);
        a->push_back(3.3);
        b->push_back(5.8);
    
        // Do stuff ...
    
        b = a;
    
        cout << "a->size() = " << a->size() << "\n";
        cout << "b->size() = " << b->size() << "\n";
    
        return 0;
    }
    

    输出

    a->size() = 3
    b->size() = 3
    

    但是,在我的一个很大的代码中,我使用 b 不是指针,我介意只为这次移动而更改整个代码。有解决方案吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Bill Fowler    7 年前

    你误解了向量如何管理它们的记忆。

    无论您使用的是简单赋值还是移动,都不会得到指向内存中相同数据的两个不同向量。在分配情况下,删除目标中的任何数据,然后复制源中的数据并将其添加到目标中。在移动情况下,删除目标中的任何数据,然后从源中删除源中的数据并将其添加到目标中。

    要回答您的问题“如何将a移动到b(以避免浪费复制时间),同时能够将a和b都用作另一个的引用?”-您不应该将a移动到b(因此没有时间复制数据),然后将b定义为对a的引用或指向a的指针:

    vector<double> a = {1.0,2.1,3.3};
    vector<double>& b_ref = a;
    vector<double>* b_ptr = &a;
    

    b\U ref和b\U ptr都允许访问a中的数据,而无需制作任何副本。