您正在对 STL 向量进行迭代,因此请使用迭代器,这就是它们的用途。
std::vector<Particle*>::iterator particle = particles.begin();
while ( particle != particles.end() ) {
bool shouldRemove = particle->update();
if ( shouldRemove ) {
particle = particles.remove(particle); //remove returns the new next particle
} else {
++particle;
}
}
或者,更好的是,使用智能指针和擦除/删除习语。Remove_if 本身就像您描述的那样,将旧成员移动到向量的后面并返回一个指向第一个无效成员的迭代器。传递这个和向量的end()
toerase
允许擦除擦除所有旧成员,因为它们在一个连续的块中。在您的场景中,您必须在调用擦除之前删除每个:
auto deleteBegin = std::remove_if(
particles.begin(), particles.end(),
[](Particle* part){ return part->update();}));
for(auto deleteIt = deleteBegin; deleteIt != particles.end(); ++deleteIt)
delete *deleteIt;
std::erase(deleteBegin, particles.end());
或 C++11 之前:
bool ShouldDelete(Particle* part) {
return part->update();
}
typedef vector<Particle*> ParticlesPtrVec;
ParticlesPtrVec::iterator deleteBegin = std::remove_if(
particles.begin(), particles.end(), ShouldDelete);
for(ParticlesPtrVec::iterator deleteIt = deleteBegin;
deleteIt != particles.end(); ++deleteIt)
delete *deleteIt;
std::erase(deleteBegin, particles.end());
然后测试整个代码的性能并优化实际瓶颈所在的位置。