Перемещение при сохранении исходного объекта

-3

#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 не как указатели, и я бы не хотел менять весь код только для этого шага. Есть ли решение?

спросил(а) 2018-02-19T22:55:00+03:00 1 год, 9 месяцев назад
1
1 ответ
45

Вы неправильно понимаете, как векторы управляют своей памятью.

Если вы используете простое назначение или переход, вы никогда не получите два разных вектора, указывающих на одни и те же данные в памяти. В случае назначения любые данные в получателе удаляются, затем копии данных в источнике создаются и добавляются в пункт назначения. В случае перемещения все данные в месте назначения удаляются, затем данные в источнике удаляются из источника и добавляются к месту назначения.

Чтобы ответить на ваш вопрос "Как я могу переместить 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 разрешают доступ к данным в без каких-либо копий.

ответил(а) 2018-02-19T23:14:00+03:00 1 год, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема