Подтвердить что ты не робот

Перемещение элемента в список без копирования

Учитывая

std::list<std::vector<float>> foo;
std::vector<float> bar;

Как мне переместить bar в конец foo без копирования данных?

Это нормально?

foo.emplace_back(std::move(bar));
4b9b3361

Ответ 1

Это нормально?

foo.emplace_back(std::move(bar));

Да, потому что:

  • std::move(bar) передает bar ссылку на rvalue.

  • std::list::emplace_back принимает любое количество ссылок пересылки и использует их для построения элемента в конце.

  • std::vector::vector имеет перегрузку (6), которая принимает ссылку rvalue, которая перемещает содержимое вектора rhs без выполнения любая копия.

Ответ 2

Да, код в Q, безусловно, ОК. Даже при использовании push_back было бы хорошо:

foo.push_back(std::move(bar));

Ответ 3

Как мне переместить bar в конец foo без копирования данных?

Используя конструктор перемещения std::vector:

foo.push_back(std::move(bar));

Это нормально?

foo.emplace_back(std::move(bar));

Это тоже хорошо.