[英]for loop doesn't end when condition is met
for(it = gameObjects.begin();it!=gameObjects.end();it++){
it->second->update(frameTime);
if(it->second->getSprite()->GetPosition().y > 500){
std::cout << "Removing enemy" << std::endl;
std::map<sf::String,VisibleGameObject*>::iterator itor = Remove(it->second->getName());
if(itor!=gameObjects.end()){
std::cout << "itor doesn't equal" << std::endl;
it=itor;
}else{
std::cout << "itor = end" << std::endl;
it=itor;
}
}
}
一旦输出itor = end
,它就会出错-“映射集迭代器不可递增”。 我认为for循环应该在它再次增加之前结束,因为it!=gameObjects.end()
在此之后将为false。 在else语句中添加一个break
解决该问题。
为什么不break
就不能工作? 我假设与检查条件时相比,迭代器递增时与它有关。
您假设正确。 迭代器在循环末尾递增,然后检查条件。
因此,在打印“ itor = end”之后,它会递增到gameObjects.end()++
,这当然是无效的。 您可以通过在循环内检查itor == gameObjects.end()
来解决问题,然后中断。
编辑:正如注释中指出的那样,最好从循环中删除++ it,以避免在删除元素后跳过该元素。 例如:
for( it = gameObjects.begin(); it!=gameObjects.end(); ) {
...
if(it->second->getSprite()->GetPosition().y > 500) {
it = Remove( it->second->getName() );
} else {
++it;
}
}
for循环首先执行该语句(增加值),然后检查条件。 问题是,for循环在到达映射末尾后尝试递增迭代器。
std::map<sf::String,VisibleGameObject*>::iterator itor = Remove(it->second->getName());
.
.
.
it=itor;
是你的问题。
在某个时间点,remove语句从gameObjects
删除最后一项,然后执行it=itor
gameObjects
,将其设置为gameObjects
的最后一项,而无需检查循环条件。 for
循环在++
循环的末尾递增,因此您已经过去了gameObjects
。
假设您可以不使用控制台输出,则可以稍微简化循环,只需执行以下操作:
for(it = gameObjects.begin();it!=gameObjects.end();){
it->second->update(frameTime);
it = it->second->getSprite()->GetPosition().y > 500
? Remove(it->second->getName());
: it++;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.