содержать — проверка, имеет ли контейнер значение (с ++)

У меня есть собственный класс «команда», и одним из его атрибутов является его «имя». После того как каждая команда создана, я добавляю ее в векторный 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;
}
}

Однако этот код действительно ужасен; Есть ли лучший способ проверить? Кроме того, более общий вопрос, связанный с проблемой некрасивого кода (как этот), какие шаги я могу предпринять, чтобы найти новую, более чистую реализацию? Благодарю.

-1

Решение

я хотел бы использовать 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);
2

Другие решения

определить оператор равенства в 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;
0

По вопросам рекламы [email protected]