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
,就会出错 - “map set iterator not incrementable”。我认为for循环应该在它再次递增之前结束,因为it!=gameObjects.end()
在此之后将为false。在else语句中添加break
可以解决问题。
为什么没有break
它不起作用?我假设当迭代器增加时,与检查条件时相比,它是有用的。
答案 0 :(得分:2)
你认为是正确的。迭代器在循环结束时递增,然后检查条件。
因此在打印“itor = end”之后,它会增加到gameObjects.end()++
,这当然是无效的。您可以通过检查循环内的itor == gameObjects.end()
然后断开来解决问题。
编辑:正如评论中指出的那样,你最好只是从循环中删除它,以避免在删除元素后跳过元素。例如:
for( it = gameObjects.begin(); it!=gameObjects.end(); ) {
...
if(it->second->getSprite()->GetPosition().y > 500) {
it = Remove( it->second->getName() );
} else {
++it;
}
}
答案 1 :(得分:2)
for循环首先执行语句(递增值)然后检查条件。问题是for循环尝试在迭代器到达映射结束后递增迭代器。
答案 2 :(得分:1)
std::map<sf::String,VisibleGameObject*>::iterator itor = Remove(it->second->getName());
.
.
.
it=itor;
是你的问题。
在某个时间点,remove语句会删除gameObjects
中的最后一项,然后执行it=itor
,将其设置为gameObjects
中的最后一项而不检查循环条件。 for
循环结束时++
次循环递增,因此您已超过gameObjects
的结尾。
答案 3 :(得分:1)
假设您可以使用控制台输出,您可以稍微简化循环,只需执行以下操作:
for(it = gameObjects.begin();it!=gameObjects.end();){
it->second->update(frameTime);
it = it->second->getSprite()->GetPosition().y > 500
? Remove(it->second->getName());
: it++;
}