#c #vector
#c #вектор
Вопрос:
Я пытаюсь создать функцию, которая найдет элемент в моей структуре, использующей векторы, но я продолжаю получать ошибку:
нет соответствия для ‘operator==’ (типы операндов ‘video_games’ и ‘const std::basic_string’)
void DataStoreVectors::findItem(vector<video_games> amp;Video_Games) {
video_games videoGames;
cout << "Type a Video Game to Find: ";
cin >> videoGames.game_name;
vector<video_games>::iterator it;
it = find(Video_Games.begin(), Video_Games.end(), videoGames.game_name);
if(it != Video_Games.end())
cout << "Found: " << videoGames.game_name << endl;
else
cout << "Not Found." << endl;
}
Что я делаю не так и что означает эта ошибка?
Комментарии:
1. Компилятор не знает, как сравнить video_game и std::string . Вам нужно реализовать operator== для их сравнения или предоставить функцию сравнения в вызове std::find .
Ответ №1:
Замените videoGames.game_name в параметрах find на videoGames. Он будет скомпилирован. Это будет работать, если ваша структура video_games имеет operator ==, который возвращает true, если свойства game_name равны.
Ответ №2:
Расширяя мой комментарий:
std::find
необходимо знать, когда он нашел совпадение. Если вы укажете какой-либо объект, он попытается сравнить этот объект с каждым элементом в коллекции, используя ==
.
Видеоигра — это не строка, сравнивать их не имеет смысла. Поэтому перегрузка operator==, как было предложено в некоторых комментариях, не является хорошим дизайном.
Рассмотрим эту альтернативу:
auto it = std::find(
Video_Games.begin(), Video_Games.end(),
[amp;](const auto amp; game) { return game.game_name == videoGames.game_name; }
);
if(it != Video_Games.end())
std::cout << "Found: " <<it->game_name <<std::endl;
else
std::cout << "Not Found." <<std::endl;
Мы сообщаем std::find
, что он должен считать совпадением для этого конкретного поиска, предоставляя ему функцию, которая возвращает true
, когда она найдена, вместо того, чтобы разрешать ей использовать ==
.
Комментарии:
1. Спасибо за ваш ответ, у меня есть несколько вопросов. 1. Создает ли ‘const auto’ другой объект, чтобы один объект не сравнивался с самим собой, как я делал раньше? 2. Что именно представляет собой оператор перегрузки==? Это то, что вы использовали в возврате? Если это так, я не понимаю, что вы имеете в виду.
2. Пожалуйста, откройте другие вопросы, если у вас есть другие вопросы 🙂
Ответ №3:
Вам не нужно хранить название видеоигры в video_games
объекте, вы можете просто сохранить его в строке video_game_name
.
Затем, начиная с c 20, вы могли бы реализовать это следующим образом:
auto it = std::ranges::find(Video_Games, video_game_name,
amp;video_games::game_name);