2010-10-16 2 views
1

Хорошо, я использую контейнеры STL STL (в настоящее время vector<customType*>). Теперь мне нужно удалить элементы из контейнера, , но использование стирания деконструирует объект, что плохо, так как я снимаю его и кладу его на переменную, производя некоторую обработку, а затем на другую.Удаление чего-либо из контейнера STL без его деконструирования

На данный момент мой код довольно противный, и я просто помещаю NULL на свое место после того, как прочитал его, в свою переменную, а затем положил if (Q [ii] NULL). Но это не так здорово.

ответ

3

Если у вас есть контейнер указателей (который это звучит, как вы делаете, так как вы назначаете NULL к «стертые» элементов), то удаление элемента из контейнера не удалить остроконечный-объект. Вы несете ответственность за это.

Если у вас есть контейнер с объектами (ну, не указательные объекты), вам необходимо скопировать элемент из контейнера, прежде чем его удалить.

+0

Ах, вы правы. Это было что-то еще, вызывающее мои ошибки. Спасибо –

1

Вы не можете удалить элемент из вектора, не разрушив его. Если ваш вектор хранит указатели, вы можете удалить указатель , который фактически не уничтожит сам элемент.

0

Операции с контейнерами STL имеют семантику копирования. Поэтому в любое время, когда вы добавляете или удаляете элементы, конструктор или деструктор будут вызваны соответственно (предполагая не примитивный тип). И если вектор будет изменен в процессе, все объекты будут копироваться и оригиналы будут уничтожены. Невозможно избежать этого копирования.

Единственный способ избежать накладных расходов - иметь вектор (умных) указателей вместо объектов.

Смежные вопросы