在保持原始对象的同时移动
Move while keeping the original object
#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
仍然指向相同的原始数据。我怎样才能 "move" a
到 b
(以避免浪费时间复制)同时能够同时使用 a
和 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
但是,在我的一个非常大的代码中,我使用 a
和 b
不是指针,我会介意只为此移动更改整个代码。有解决办法吗?
你误解了向量如何管理它们的内存。
无论您使用的是简单的赋值还是移动,您都不会得到两个不同的向量指向内存中的相同数据。在分配情况下,删除目标中的所有数据,然后制作源中数据的副本并将其添加到目标中。在移动情况下,目标中的所有数据都会被删除,然后源中的数据会从源中删除并添加到目标中。
回答您的问题"How can I move a to b (to avoid losing time copying) while being able to use both a and b as if one was a reference of the other?" - 您根本不应该将 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 中的数据而无需进行任何复制。
#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
仍然指向相同的原始数据。我怎样才能 "move" a
到 b
(以避免浪费时间复制)同时能够同时使用 a
和 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
但是,在我的一个非常大的代码中,我使用 a
和 b
不是指针,我会介意只为此移动更改整个代码。有解决办法吗?
你误解了向量如何管理它们的内存。
无论您使用的是简单的赋值还是移动,您都不会得到两个不同的向量指向内存中的相同数据。在分配情况下,删除目标中的所有数据,然后制作源中数据的副本并将其添加到目标中。在移动情况下,目标中的所有数据都会被删除,然后源中的数据会从源中删除并添加到目标中。
回答您的问题"How can I move a to b (to avoid losing time copying) while being able to use both a and b as if one was a reference of the other?" - 您根本不应该将 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 中的数据而无需进行任何复制。