满足条件时 for 循环不会结束
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()
将是错误的。在 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
中的最后一项,而不检查循环条件。 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++;
}
相关文章:
- 为什么在这个代码结束循环中没有得到结束
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 使用 shared_ptr 在中断时结束多线程循环
- 如何使用循环结束 c++ 上的行
- 具有迭代器和自定义步长的循环结束条件
- 为什么这个 while 循环在下面的代码中没有结束?
- 为什么在使用不相关的宏时会阻止 while 循环结束?
- 为什么我的 while 循环永远不会在 C++ 中的数字猜测游戏中结束?
- while 循环 C++ 结束,但不继续到其余语句
- 当满足条件时,While循环未结束
- 使用分隔符结束用户输入的循环
- <= 和 == 运算符无法正常工作以结束循环
- C 如何结束一个段循环,该循环添加数字而不使用数字作为触发器来结束循环
- 如果其中一个为真,则 && 结束循环,而不是如果两者都为真
- 在 x 时间后结束循环的性能最低占用方式
- 如果用户对C++说,如何提前结束循环
- C++ 循环条件未结束循环
- 一旦用户错了两次,就结束循环
- EOF和GETCHAR结束循环
- 在sentinel使用条件语句结束循环后显示最大值