满足条件时 for 循环不会结束

for loop doesn't end when condition is met

本文关键字:结束 循环 for 条件 满足      更新时间:2023-10-16
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++;
}