«Правильный» способ сделать это - использовать алгоритм:
#include <algorithm>
#include <functional>
// this is a function object to delete a pointer matching our criteria.
struct entity_deleter
{
void operator()(Entity*& e) // important to take pointer by reference!
{
if (e->GetXPos() > 1.5f)
{
delete e;
e = NULL;
}
}
// now, apply entity_deleter to each element, remove the elements that were deleted,
// and erase them from the vector
for_each(Entities.begin(), Entities.end(), entity_deleter());
vector<Entity*>::iterator new_end = remove(Entities.begin(), Entities.end(), static_cast<Entity*>(NULL));
Entities.erase(new_end, Entities.end());
Теперь я знаю, о чем ты думаешь. Вы думаете, что некоторые другие ответы короче.
Но, (1) этот метод обычно компилируется в более быстрый код - попробуйте сравнить его, (2) это «правильный» способ STL, (3) меньше шансов для глупых ошибок, и (4) легче читать После того, как вы можете прочитать код STL. Стоит изучать программирование на STL, и я предлагаю вам ознакомиться с замечательной книгой Скотта Мейера «Эффективный STL», в которой есть множество советов по STL по этому виду вещей.
Другим важным моментом является то, что, не стирая элементы до конца операции, элементы не нужно перетасовывать. GMan предлагал использовать список, чтобы избежать этого, но при использовании этого метода вся операция - O (n). Код Нейла, приведенный выше, напротив, O (n ^ 2), поскольку поиск O (n), а удаление O (n).