Are you declaring your vector like this:
std::vector<Zombie> zombies;
Or like this:
std::vector<Zombie*> zombies;
P.S: I have tried simple deleting the object using delete zombies[ i ], but the program just stops responding
You can only 'delete' objects you have 'new'd. If you don't know what new or delete do, just don't touch them at all until you thoroughly research the issue.
new and delete are dangerous to your code (but won't do any harm to your computer, so feel free to experiment) if used improperly.
std::vectors are made for very fast access. It's not good for fast removals or fast inserts, unless you remove or insert from the end of the list with push_back() or pop_back(). You probably want a std::list, which is designed for inserting and erasing from in the very middle of the container.
std::list<Zombie> zombies;
typedef std::list<Zombie>::iterator ZombieIterator;
for(ZombieIterator it = zombies.begin(); it !- zombies.end(); it++)
{
if(it->dead)
{
it = zombies.erase(it); //erase() removes the element at the position given, and returns the next element.
it--; //Take a step back, so the for-loops 'it++' doesn't skip an element.
}
}
Alternatively, you could use the "swap and pop" method. Swaps are fast. Pops are fast. You swap the dead zombie with the live zombie at the end of the vector (messing up ordering, but you might not care about the order in this situation), and pop back the vector erasing the dead zombie.
std::vector<Zombie> zombies;
typedef d::vector<Zombie>::iterator ZombieIterator;
for(ZombieIterator it = zombies.begin(); it != zombies.end(); it++)
{
if(it->dead)
{
//Swap the value of the current zombie with the zombie at the back of the container.
std::swap(*it, zombies.back());
//Pop the back of the container.
zombies.pop_back();
}
}
A third method is to use a standard algorithm like
std::remove_if() to do this for you. You pass a range of iterators to std::remove_if(), and you also pass a callback function or functor to say which elements to remove.
bool ZombieIsDead(const Zombie &zombie)
{
return zombie.dead;
}
std::vector<Zombie> zombies;
typedef d::vector<Zombie>::iterator ZombieIterator;
ZombieIterator newEnd = std::remove_if(zombies.begin(), zombies.end(), ZombieIsDead);
zombies.erase(newEnd, zombies.end());
If using C++11, you can use a lambda as a callback function.