Перемещение элемента в список без копирования
Учитывая
std::list<std::vector<float>> foo;
std::vector<float> bar;
Как мне переместить bar
в конец foo
без копирования данных?
Это нормально?
foo.emplace_back(std::move(bar));
Ответы
Ответ 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));
Это тоже хорошо.