Here’s my code for updating a list of items in a vector and removing some of them:
std::vector<Particle*> particles;
...
int i = 0;
while ( i < particles.size() ) {
bool shouldRemove = particles[ i ]->update();
if ( shouldRemove ) {
delete particles[ i ];
particles[ i ] = particles.back();
particles.pop_back();
} else {
i++;
}
}
When I find an item that should be removed, I replace it with the last item from the vector to avoid potentially copying the rest of the backing array multiple times. Yes, I know it is premature optimization…
Is this a valid way of removing items from the vector? I get some occasional (!) crashes somewhere around this area but can’t track them down precisely (LLDB fails to show me the line), so I would like to make sure this part is OK. Or is it… ?
UPDATE: I found the bug and indeed it was in another part of my code.
Yes, this is a valid way. But if it is not a performance bottleneck in your program then it’s better to use smart pointers to manage the lifetime of
Particleobjects.