检查Container是否有值(c ++)

时间:2012-11-18 03:10:54

标签: c++ contain

我有一个自定义类'团队',其中一个属性是'name'。创建每个“团队”后,我将其添加到矢量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;
    }
}

然而,这段代码真的很难看;有没有更好的检查方法?还有一个更普遍的问题 - 面对丑陋的代码问题(比如这个),我可以采取什么样的步骤来找到一个新的,更清洁的实现?感谢。

2 个答案:

答案 0 :(得分: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); 内重新提示:

{{1}}

答案 1 :(得分: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;