Die „richtige“ Weg, dies zu tun, wird ein Algorithmus verwendet:
#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());
Jetzt weiß ich, was du denkst. Sie denken, dass einige der anderen Antworten kürzer sind. Aber (1) diese Methode kompiliert in der Regel zu schneller Code - versuchen Sie es zu vergleichen, (2) dies ist die "richtige" STL Weg, (3) gibt es weniger eine Chance für dumme Fehler, und (4) es ist einfacher zu Lesen Sie, sobald Sie den STL-Code lesen können. Es lohnt sich, die STL-Programmierung zu lernen, und ich schlage vor, Sie schauen sich Scott Meyers grossartiges Buch "Effective STL" an, das viele STL-Tipps zu solchen Sachen enthält.
Ein weiterer wichtiger Punkt ist, dass die Elemente nicht bis zum Ende der Operation gelöscht werden müssen, da die Elemente nicht gelöscht werden müssen. GMan schlug vor, eine Liste zu verwenden, um dies zu vermeiden, aber mit dieser Methode ist die gesamte Operation O (n). Der obige Code von Neil ist dagegen O (n^2), da die Suche O (n) ist und die Entfernung O (n) ist.
Bitte kennzeichnen Sie Ihre Fragen mit der Sprache/Umgebung, die Sie verwenden, damit wir wissen, was Sie auf der Hauptseite verwenden (und Sie werden viele weitere Ansichten erhalten). – Zifre
Aber du weißt nicht, was er mit dem Vektor im Rest seines Codes macht! Im Allgemeinen sollte ein Vektor der erste Wahlcontainer sein, wobei andere Dinge gleich sind. –
Im Allgemeinen sollten Sie STL-Algorithmen handgeschriebenen Schleifen vorziehen. – rlbond