在粒子系统中,一旦粒子变得足够老,它们就需要死亡。由于它们存储std::vector
在 XCode 中运行良好的方法是:
for(std::vector<Particle*>::reverse_iterator iter = particles.rbegin(); iter != particles.rend(); ++iter) {
(*iter)->update();
if ( (*iter)->isDead() ) {
delete (*iter);
particles.erase( --iter.base() );
}
}
启动到 Windows 并在 Visual Studio 2010 中编译后,我发现它不起作用:请参阅此处。正如答案本身所说,这不适用于关联容器。我发现这里最令人沮丧的是std::reverse_iterator
并且std::iterator
表现不同:
.erase
不接受 areverse_iterator
并且想要一个真实的东西(例如看到这个)rev_it.base()
调用需要在擦除调用中递减- 擦除后,我需要将其转换
std::iterator
为std::reverse_iterator
我曾想过使用向前std::iterator
但向后迭代,这是一个糟糕的主意——但向后迭代的真正需要是确保循环不会跳过 erased 的相邻成员particles
。
但是,对我来说有意义的是,如果进行了调用,则不会进行迭代.erase()
:
for( std::vector<Particle*>::iterator iter = particles.begin(); iter != particles.end(); ) {
(*iter)->update();
if ( (*iter)->isDead() ) {
delete (*iter);
iter = particles.erase(iter);
} else {
++iter;
}
}
这编译,工作,并且似乎不是问题。不过,问题是:
我是否忽略了一些使这个想法变得特别愚蠢的东西?
(我确信这iter
将通过利用.erase()
函数的值来指向正确的下一个值return
,而且它对我来说似乎比--iter.base()
调用更具可读性。)
撇开括号不谈,我脑海中浮现的一句俄罗斯谚语是“一个被热牛奶烫伤的人在冷水上吹。”