stdvector — удаление объектов из контейнеров C ++ без их удаления

Я использую вектор C ++ std для хранения объектов рендеринга для простой реализации графа сцены. Мне нужна возможность добавлять и удалять объекты рендеринга во время выполнения из графа сцены. Добавление не является проблемой, для удаления: чтение документов для вектора и др. В контейнерах C ++ создается впечатление, что когда объекты выталкиваются, их деструкторы вызываются. Это не то, что мне нужно, потому что я хочу иметь возможность повторно добавить эти объекты позже в цикл рендеринга. Каковы возможные решения этой проблемы?
Важная деталь, которую я забыл упомянуть — я использую вектор указателей для объектов рендеринга.

5

Решение

Кажется, вы запутались с основной концепцией экземпляров объектов. Когда вы добавляете что-то в вектор, вы не перемещаете это в него, вы копируете это:

vector<string> vec;
string s;
vec.push_back(s);

vec[0] является не sэто копия s, Поэтому, когда вы удаляете его из вектора, s является не пострадавшие.

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

Редактировать:
ОК, кажется, вы уже используете указатели. Вы сказали:

чтение документов для вектора и других контейнеров C ++, кажется, что когда
объекты лопаются, их деструкторы называются

Это правда. Когда вы удаляете указатель из вектора, указатель уничтожается. Вот что значат документы. Это не значит, что объект, на который указывает указатель, разрушается:

vector<string*> vec;
string s;
vec.push_back(&s);
vec.pop_back();

s не влияет вообще. Операция pop уничтожает указатель, который содержит адрес sне s сам.

Так что ты в порядке.

7

Другие решения

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

std::vector<object*> x;

На уничтожение этого vector объекты, на которые указывают, не затронуты.

Если вы хотите поделиться собственностью, используйте boost::shared_ptr или же std::shared_ptr,

3

Когда указатель выталкивается, деструктор не вызывается. Условно даже у примитивных типов есть деструкторы, чтобы объяснить, что происходит, когда они выходят за рамки. Уничтожение вектора указателей — это то же самое, что вывод локальных переменных-указателей из области видимости.

Ссылка подсчет умные указатели являются объектами, которые перегружают * а также -> операторы ведут себя как указатели. Они реализуют деструктор, чтобы уничтожить указанный объект, таким образом реализуя собственность. Но для графа сцены это, вероятно, не нужно.

2
По вопросам рекламы [email protected]