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

时间:2012-01-28 14:47:58

标签: c++ for-loop conditional-statements

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它不起作用?我假设当迭代器增加时,与检查条件时相比,它是有用的。

4 个答案:

答案 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++;
}