Извлечение чего-либо из контейнера STL без его деконструкции - PullRequest
1 голос
/ 16 октября 2010

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

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

Ответы [ 3 ]

3 голосов
/ 16 октября 2010

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

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

1 голос
/ 16 октября 2010

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

0 голосов
/ 16 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...