Перемещение при сохранении исходного объекта
#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
(чтобы избежать потери времени копирования), имея возможность использовать как 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
не как указатели, и я бы не хотел менять весь код только для этого шага. Есть ли решение?
Вы неправильно понимаете, как векторы управляют своей памятью.
Если вы используете простое назначение или переход, вы никогда не получите два разных вектора, указывающих на одни и те же данные в памяти. В случае назначения любые данные в получателе удаляются, затем копии данных в источнике создаются и добавляются в пункт назначения. В случае перемещения все данные в месте назначения удаляются, затем данные в источнике удаляются из источника и добавляются к месту назначения.
Чтобы ответить на ваш вопрос "Как я могу переместить a на b (чтобы избежать потери времени на копирование), имея возможность использовать как a, так и b, как если бы это была ссылка на другую?" - Вы не должны перемещать a на b вообще (так что время, затрачиваемое на копирование данных), а затем определить b как ссылку на a или указатель на:
vector<double> a = {1.0,2.1,3.3};
vector<double>& b_ref = a;
vector<double>* b_ptr = &a;
Оба b_ref и b_ptr разрешают доступ к данным в без каких-либо копий.