Передавайте аргументы конструктора прямо в emplace_back, а не готовый временный объект. Для предотвращения перевыделений при известном размере заранее вызовите reserve.
Объясните пример с std::vector и emplace_back: как избежать лишнего копирования?
Передавайте аргументы конструктора прямо в emplace_back, а не готовый временный объект. Для предотвращения перевыделений при известном размере заранее вызовите reserve.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Передавайте аргументы конструктора прямо в emplace_back, а не готовый временный объект. Для предотвращения перевыделений при известном размере заранее вызовите reserve.
items.emplace_back(arg1, arg2) строит элемент в памяти vector. Запись items.emplace_back(Item(arg1, arg2)) сначала создаёт временный Item и обычно затем перемещает его, поэтому не использует главное преимущество emplacement.
Если capacity исчерпана, vector всё равно переносит существующие элементы в новый буфер. noexcept move-конструктор может позволить перемещение вместо копирования для сохранения гарантий исключений. reserve задаёт вместимость, а не размер.
Не вызывайте reserve на каждый новый элемент: это может разрушить эффективную стратегию роста. Для уже готового объекта push_back(std::move(item)) часто выражает намерение столь же понятно.