emplace_back вызывает оператор присваивания в векторах, но не в списке

Согласно http://www.cplusplus.com/reference/vector/vector/emplace_back/ я понял, что emplace_back будет создавать объекты на месте без вызова оператора присваивания. Но в случае std::vector они вызывают оператор присваивания и не вызывают операторы присваивания в случае std::list.

Мой объект не копируется. Есть ли другой способ обойти проблему, кроме как с помощью указателей.

Также стирание в векторе, похоже, вызывает оператор присваивания, удаление в списке не вызывает оператор присваивания. это показалось мне неправильным..

Разве std не поддерживает объекты, которые нельзя скопировать?

1 ответ

vector требует, чтобы тип элемента был подвижным (не обязательно копируемым), чтобы поддерживать элементы в непрерывном массиве.

Для вставки в любой момент может потребоваться переместить все элементы в новый массив, если старая емкость была слишком мала. Стирание, за исключением конца, требует перемещения элементов после стертого (ых).

Другие контейнеры не требуют, чтобы тип был подвижным, поэтому, возможно, deque (позволяет вставлять и удалять с любого конца) или list (разрешить вставку и удаление в любом месте) может быть вариантом, если вы не можете (или не хотите) сделать его подвижным.

Другие вопросы по тегам