-1

我有一个自定义类“团队”,它的属性之一是它的“名称”。创建每个“团队”后,我将其添加到矢量团队列表中。

我想实现一个功能,不断提示用户输入一个团队名称,该名称尚未被团队列表中的团队使用。我有以下代码:

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, 它为您处理重复项。举个例子,你可以看到类是按字符串成员排序的,当插入三个时main,只留下两个,因为其中两个插入的字符串相同,所以它们被视为相等。

#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,可以将 ateam与字符串进行比较:

  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 回答