Я использую вектор для хранения указателей на класс.
class fooContainer{
private:
vector <Foo *> foos;
public:
void processFoo(int fooIndex);
};
Проблема, с которой я сталкиваюсь, заключается в том, что pop_back()
удаляет элемент, я только хочу удалить его из вектора, но не трогать рассматриваемый объект. Мне также нужно удалить все элементы из вектора при подготовке к перезапуску основного цикла (но оставить тот же вектор, который является атрибутом класса).
Мне нужна структура, которая имеет динамический размер, но не копирует и не удаляет ее элементы, будучи содержимым для хранения указателей на них.
Есть ли лучшая альтернативная структура, или я использую их все неправильно?
Vector копирует и уничтожает его содержимое, но в вашем случае это указатель на объект, а не объект.
Конкретный указатель на объект будет уничтожен, но другие указатели на этот объект и сам объект не будут уничтожены.
То, что у вас есть, делает именно это. Элементы объекта в векторе не будут уничтожены, если вы явно не delete
их.
В качестве альтернативы, если вы хотите использовать одни и те же указатели в нескольких местах с общим владением, я предлагаю использовать std::shared_ptr
,
pop
не «удаляет» элемент, он просто удаляет его из вектора. Поскольку ваш вектор содержит указатели, вы несете ответственность за их надлежащее удаление.
Вектор делает именно то, что вы просите.
Чтобы удалить элементы, просто позвоните vector.clear()
Если вы просто хотите получить копию вашего указателя с вашего вектора, то вы можете использовать Foo* pfoo = v[0]
или at(index)
функция для проверенного доступа.
Также вы хотите очистить все ваши указатели, вы можете просмотреть их, удалить их все и вызвать v.clear()
удалить все элементы.
Если вы хотите вектор, который уже правильно удаляет указатели, используйте boost::vector_ptr