私は手札を受け取ってペアをチェックする関数をコーディングしています:
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
。