【问题标题】:Move while keeping the original object在保持原始对象的同时移动
【发布时间】:2018-07-30 02:35:26
【问题描述】:
#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 仍然指向相同的原始数据。我怎样才能将a“移动”到b(以避免浪费时间复制)同时能够同时使用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 不是指针,我介意只为这个动作更改整个代码。有解决办法吗?

【问题讨论】:

  • 使用引用还是指针?
  • 如果您搬进新公寓,是否意味着您的所有物品都可以在新旧公寓中使用?
  • 所以您想在没有实际参考的情况下获得参考?这是 XY 问题吗?
  • std::ref 会做你想做的事,但你真正需要的实际用例会有所帮助。
  • @Remi.b 可能是最好的。我不确定为什么它被否决,但这可能是因为人们认为您没有研究实际移动某物时发生的情况。

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


【解决方案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 都允许访问 a 中的数据而无需进行任何复制。

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多