我有一个自定义类'团队',其中一个属性是'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;
}
}
然而,这段代码真的很难看;有没有更好的检查方法?还有一个更普遍的问题 - 面对丑陋的代码问题(比如这个),我可以采取什么样的步骤来找到一个新的,更清洁的实现?感谢。
答案 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;