ここで goto の使用を避けるべきでしょうか? そうであれば、どのようにすればよいでしょうか? 質問する

ここで goto の使用を避けるべきでしょうか? そうであれば、どのようにすればよいでしょうか? 質問する

私は手札を受け取ってペアをチェックする関数をコーディングしています:

int containsPairs(vector<Card> hand)
{
    int pairs{ 0 };

    loopstart:
    for (int i = 0; i < hand.size(); i++)
    {
        Card c1 = hand[i];
        for (int j = i + 1; j < hand.size(); j++)
        {
            Card c2 = hand[j];
            if (c1.getFace() == c2.getFace())
            {
                pairs++;
                hand.erase(hand.begin() + i);
                hand.erase(hand.begin() + (j - 1));
                goto loopstart;
            }
        }
    }
    return pairs;
}

10 行目でペアが見つかったら、ペアが見つかった手札のカードを削除し、削除したカードでループ全体を再開して、2 番目のペアがあればそれを見つけます。私にとっては、goto が最も直感的な方法でしたが、この場合、それは本当でしょうか?

ベストアンサー1

これを試して:

int containsPairs(vector<int> hand)
{
    int pairs{ 0 };

    for (int i = 0; i < hand.size(); i++)
    {
        int c1 = hand[i];
        for (int j = i + 1; j < hand.size(); j++)
        {
            int c2 = hand[j];
            if (c1 == c2)
            {
                pairs++;
                hand.erase(hand.begin() + i);
                hand.erase(hand.begin() + (j - 1));
                i--;
                break;
            }
        }
    }
    return pairs;
}

これはほぼあなたのバージョンですが、唯一の違いは goto の代わりに があることですi--; break;。このバージョンは二重ループを 1 回だけ実行するので、あなたのバージョンよりも効率的です。

もっと明確になりましたか? まあ、それは個人的な好みです。私はまったく反対ではありませんが、現在の「決して使用しない」というステータスは修正されるべきだと思います。が最善の解決策となるgoto場合があります。goto


さらに簡単な別の解決策は次のとおりです。

int containsPairs(vector<int> hand)
{
    int pairs{ 0 };

    for (int i = 0; i < hand.size(); i++)
    {
        int c1 = hand[i];
        for (int j = i + 1; j < hand.size(); j++)
        {
            int c2 = hand[j];
            if (c1 == c2)
            {
                pairs++;
                hand.erase(hand.begin() + j);
                break;
            }
        }
    }
    return pairs;
}

基本的に、ペアが見つかったら、のみはより遠いカードであり、ループを破ります。したがって、 を巧みに扱う必要はありませんi

おすすめ記事