Как искать элемент в векторной структуре?

#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);