-1

カスタム クラス「チーム」があり、その属性の 1 つはその「名前」です。各「チーム」が作成されたら、それをベクターの teamList に追加します。

teamList 内のチームがまだ使用していないチーム名をユーザーに継続的に求める機能を実装したいと考えています。次のコードがあります。

while (true) {
    string newString;
    bool flag = true;
    getline(cin, newString);
    for (int i = 0; i < teamList.size(); i++) {
        if (teamList[i].name.compare(newString) == 0) flag = false; 
    }
    if (flag == true) {
        return newString;
    } else {
        cout << "name already taken." << endl;
    }
}

ただし、このコードは本当に醜いです。確認する良い方法はありますか?また、より一般的な質問 - (このような) 醜いコードの問題に直面している場合、新しい、よりクリーンな実装を見つけるためにどのような手順を実行できますか? ありがとう。

4

2 に答える 2

2

重複を処理する を使用std::setします。例として、クラスが文字列メンバーでソートされていることがわかります。3 つが に挿入された場合、挿入されmainた 2 つが同じ文字列を持っているため、2 つだけが残り、同等に扱われます。

#include <iostream>
#include <set>
#include <string>

struct SetThing {
    SetThing(int value, const std::string &value2) : i(value), s(value2){}

    int i;
    std::string s;

    bool operator<(const SetThing &other) const {
        return s < other.s;
    }
};

int main() {
    std::set<SetThing> s;
    s.insert(SetThing(5, "abc"));
    s.insert(SetThing(4, "def"));
    s.insert(SetThing(6, "abc"));
    std::cout << s.size();
}

second挿入するために、返されたペアのメンバーが次の場合に再プロンプトできますfalse

do {
    //get input
} while (!teamList.insert(somethingBasedOnInput).second);
于 2012-11-18T03:24:48.610 に答える
0

を文字列teamと比較できる等式演算子を定義します。team

  bool team::operator==(string s) const
  {
    return(s==name);
  }

次に、使用できますfind

vector<team>::const_iterator itr = find(teamList.begin(), teamList.end(),
                                        newString);

if(itr!=league.end())
  cout << "name already taken" << endl;
于 2012-11-18T06:59:37.743 に答える