在保持原始对象的同时移动

时间:2018-02-19 19:55:38

标签: c++ memory copy move move-semantics

#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仍然指向相同的原始数据。我怎样才能&#34;移动&#34; ab {以避免浪费时间复制',同时能够同时使用ab,就好像一个是另一个的引用?我不能使用引用,因为它必须更改它引用的内容。

我可以使用指针

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

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

1 个答案:

答案 0 :(得分:1)

你误解了矢量如何管理他们的记忆。

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

回答你的问题“我怎样才能将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_ref和b_ptr都允许在不进行任何复制的情况下访问数据。