你正在迭代一个STL向量,所以使用迭代器,这就是它们的用途。
std::vector<Particle*>::iterator particle = particles.begin();
while ( particle != particles.end() ) {
bool shouldRemove = particle->update();
if ( shouldRemove ) {
particle = particles.remove(particle);
} else {
++particle;
}
}
或者更好的方法是使用智能指针和
erase/remove idiom。Remove_if本身就像你所描述的那样,将旧成员移动到向量的后面,并返回一个指向第一个非有效成员的迭代器。将此迭代器和向量的
end()
传递给
erase
,允许erase删除所有旧成员,因为它们在一个连续的块中。在您的情况下,在调用erase之前,您必须删除每个成员:
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());
然后测试整个代码的性能,并在实际瓶颈处进行优化。
remove_if()
жӣҙеҝ« - еӣ дёәremove_if()
дҝқжҢҒеү©дҪҷе…ғзҙ зҡ„йЎәеәҸпјҢиҖҢиҝҷдёӘз»“жһ„дёҚдҝқжҢҒйЎәеәҸгҖӮ - Dan Nissenbaum