繁体   English   中英

条件满足时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()在此之后将为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM