У меня есть собственный класс «команда», и одним из его атрибутов является его «имя». После того как каждая команда создана, я добавляю ее в векторный 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;
}
}
Однако этот код действительно ужасен; Есть ли лучший способ проверить? Кроме того, более общий вопрос, связанный с проблемой некрасивого кода (как этот), какие шаги я могу предпринять, чтобы найти новую, более чистую реализацию? Благодарю.
я хотел бы использовать 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);
определить оператор равенства в 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;