Перемещение элемента в список без копирования Учитывая 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)); Это тоже хорошо.
Ответ 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)); Это тоже хорошо.