0

私はC++にかなり慣れていないので、これがばかげた質問であれば許してくださいstd::find.

例として、性別を保存できる基本的なプログラムがあるとします。ユーザーが「男性」または「男性」を入力したかどうかを確認するだけの if ステートメントがあります。

if(gender == "male" || gender == "Male"){
    // Do stuff
}

ユーザーが「m」または「M」も入力できるように拡張したいと思います。男性として検出されます。ただし、ifステートメントは少し面倒だと思うので、オプションを単純な配列に貼り付けて、次のことを行うことを考えています。

if(gender is in maleArray){
    // Do stuff
}

これは可能ですか?これは学習シナリオであるため、関連する悪い慣行についてはあまり気にしませんが、例として、(有用な) 批判や代替案を歓迎します!

事前に感謝します。十分に明確にしていただければ幸いです。

4

2 に答える 2

4

あなたが求めている解決策は次のとおりです。

std::array<std::string, 4> male_synonyms = {"Male", "male", "M", "m"};
auto it = std::find(male_synonyms.begin(), male_synonyms.end(), gender);
if (it != male_synonyms.end()) {
  // ...
}

std::findユーザー入力genderが文字列のシーケンス内にあるかどうかを確認するために使用しますmale_synonymsstd::find終了イテレータが見つからない場合はそれを返すので、それをチェックします。

ただし、私はこれを好むでしょう:

std::transform(gender.begin(), gender.end(), gender.begin(), std::tolower);
if (gender == "m" || gender == "male") {
  // ...
}

これは、大文字と小文字mを区別せずに受け入れmaleます。したがってMalEMmALE、 なども正しいです。

于 2013-02-26T16:57:47.533 に答える
2

あなたの懸念が if ステートメントの乱雑さである場合は、ブール値を返すメソッド isMale() を持つことができます。その後、if(isMale(gender)) のように使用できます。

bool isMale(std::string gender)
{
    if(gender == "male" || 
       gender == "Male" ||
       gender == "M"    ||
       gender == "m"      )
    {
        return true;
    }
    else
    {
        return false;
    }
}

大文字と小文字を気にしない場合は、性別の文字列をすべて小文字に変換してから、「male」と「m」を比較できます。

于 2013-02-26T16:57:30.487 に答える