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

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

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

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

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


person Cpp crusaders    schedule 09.02.2015    source источник
comment
Пожалуйста, добавьте код, иллюстрирующий ваши проблемы. Упростит понимание вопроса.   -  person Pradhan    schedule 09.02.2015


Ответы (1)


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

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

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

person Mike Seymour    schedule 09.02.2015
comment
deque не будет работать для стирания (или вставки посередине). - person T.C.; 09.02.2015
comment
@T.C.: Действительно. Было бы хорошо, если бы вы просто хотели манипулировать концами. - person Mike Seymour; 09.02.2015