如何删除'转到'从这个循环?

时间:2017-07-16 19:47:29

标签: c++ iteration

我有一个循环,寻找3张相同的卡或3张非相等的牌并在找到它时删除,如果它没有找到第2个等于/非等于第一个选择的元素,它会删除第一个元素并且去到另一个等等......

好吧,我在此代码中使用gotobreak个循环内部for开始,并在整个while内继续迭代。

对我而言,在这种特定情况下使用goto是很有意义的。但是,由于我不是一个非常有经验的程序员,我认为有更好的方法来做到这一点,这是一种更有效的方式。

有吗?怎么会这样?在这种情况下不使用goto

unsigned int i1 = 0;
while(gameCards.size() > 2)
{
    for(unsigned int i2=1; i2<gameCards.size(); i2++)
    {
        if(i2 == 2) continue;

        if(cannotMatch(gameCards.at(i1), gameCards.at(i2)))
        {
            for(unsigned int i3=2; i3<gameCards.size(); i3++)
            {
                if(cannotMatch3(gameCards.at(i1), gameCards.at(i2), gameCards.at(i3)))
                {
                    SetMatches++;
                    gameCards.erase(gameCards.begin()+i2,gameCards.begin()+i3);
                    goto findAnother;
                }
            }
        } else if(canMatch(gameCards.at(i1), gameCards.at(i2)))
        {
            for(unsigned int i3=2; i3<gameCards.size(); i3++)
            {
                if(canMatch3(gameCards.at(i1), gameCards.at(i2), gameCards.at(i3)))
                {
                    SetMatches++;
                    gameCards.erase(gameCards.begin()+i2,gameCards.begin()+i3);
                    goto findAnother;
                }
            }
        }
    }

    findAnother:

    gameCards.erase(gameCards.begin()+(i1++));
}

2 个答案:

答案 0 :(得分:2)

你可以设置一个额外的bool条件来打破外部for循环。当你注意到它们基本相同时,你也可以简化内部循环,只需调用不同的match3函数:

while(gameCards.size() > 2)
{
    auto continue_outer_loop(true);
    for(unsigned int i2=1; continue_outer_loop && (i2<gameCards.size()); i2++)
    {
        if(i2 == 2) continue;
        auto const p_match_3_func
        (
            cannotMatch(gameCards.at(i1), gameCards.at(i2))
            ?
            &cannotMatch3
            :
            &canMatch3
        );
        for(unsigned int i3=2; i3<gameCards.size(); i3++)
        {
            if((*p_match_3_func)(gameCards.at(i1), gameCards.at(i2), gameCards.at(i3)))
            {
                SetMatches++;
                gameCards.erase(gameCards.begin()+i2,gameCards.begin()+i3);
                continue_outer_loop = false;
                break;
            }
        }
    }
    gameCards.erase(gameCards.begin()+(i1++));
}

答案 1 :(得分:0)

您可以添加保护变量并在循环中检查它。但是只有当你在循环结束时才这样做,因为它不是真正的休息。

while (mainLoop) {
    int goMain = 0;
    for (int i = 0; i < 5 && goMain == 0; i++) {
        for (int j = 0; j < 5 && goMain == 0; j++) {
            if (wantExit) {
                goMain = 1;
            }
        }
    }
}