2012-06-16 2 views
1

У меня есть std::vector, который содержит все объекты и передается им в каждом кадре, чтобы каждый объект мог обращаться к другим объектам. Мой вопрос в том, как объект может удалять себя из вектора?C++: vector.erase (this)

Это не работает:

vector.erase(this); 

Есть ли другое решение для этого?

+2

Отсутствует важная деталь. К сожалению, я не знаю, что это может быть. – Joshua

+0

Было бы полезно, если бы вы показали больше кода или минимальный тестовый пример, который показывает, как вы это делаете и что хотите. –

ответ

4

Вы должны удалить элемент путем доступа к его итератор, это может быть сделано через std::find, или если вы знаете, индекс (менее сложности) через:

vector.begin() + indexOfElement 

, так что вы можете удалить его:

vector<Type>::iterator it = yourVector.begin() + index; 
yourVector.erase(it); 

вида, что, так как вектор хранит свои данные в виде массива, это вызывает все элементы после того, вы удаляете быть смещены влево (что дорого). Вместо этого воспользуйтесь std::list, если вам не нужен произвольный доступ.

8

erase требует итератора. this - это указатель, доступный в определении функций члена/класса. Кроме того, erase необходимо вызвать на экземпляр vector - вы не можете использовать vector.erase.

Объект не может удалить себя. Вам нужно будет передать итератор. Вы можете использовать std::find, чтобы узнать, существует ли объект внутри вектора, а затем передать его.

1

В качестве альтернативы вы можете использовать набор и использование set.erase (это)

1

Как упоминалось вы можете использовать STD :: найти (http://www.cplusplus.com/reference/algorithm/find/) Для этого необходимо перегрузить оператор ==, если я не ошибаюсь.

Например

std::vector<YourObjectType>::iterator it = find(yourVector.begin(), yourVector.end(), referenceToObject); 

bool operator == (const YourObjectType* object) {return object == this; } 

И тогда вы просто использовать yourVector.erase(it);

1

Вы можете сделать это, как:

vec.erase(vec.begin() + (this - &vec.front())); 

, если вы уверены, что элемент из вектора в самом деле

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