Почему я получаю ошибку при использовании std :: find () для вектора?

Я пытаюсь использовать функцию std::find() для std::vector . Почему этот код вызывает ошибку, и как я могу это исправить?

struct person_id{
    int p_id;
};
std::vector<person_id> people;

person_id tmp_person;
tmp_person.p_id = 5;
people.push_back(tmp_person);

if(std::find(people.begin(), people.end(), 5) != people.end()) {
    cout<<"Contain"<<endl;
} else {
    cout<<"Not Contain"<<endl;           
}

Всего 2 ответа


Вам нужно добавить constructor и operator == чтобы исправить ошибку компилятора

#include <algorithm>
#include <vector>
#include <iostream>
struct person_id{
    person_id() = default;
    person_id(int id) : p_id (id) {}

    bool operator==(const person_id& other) { return p_id == other.p_id; }
    int p_id;
};
using std::cout;
using std::endl;

int main(int argc, char* argv[]) {
    std::vector<person_id> people;

    person_id tmp_person;
    tmp_person.p_id = 5;
    people.push_back(tmp_person);

    if(std::find(people.begin(), people.end(), 5) != people.end()) {
        cout<<"Contain"<<endl;
    } else {
        cout<<"Not Contain"<<endl;           
    }
    return 0;
}
  • конструктор используется для неявного преобразования 5 (тип int) в struct person_id
  • оператор == требуется функцией std::find

Проверьте это здесь: https://coliru.stacked-crooked.com/a/437f4ec26bbc7995


Ваш вектор является контейнером типа person_id , который вы person_id , используя значение int . Как компилятор должен знать, что целочисленный литерал 5 должен сравниваться с полем p_id ?

Простое решение - иметь vector<int> : зачем вам эта структура? Если вам все еще нужен этот тип, определите оператор сравнения или оператор преобразования ... Есть много способов реализовать это, дайте нам больше подробностей.


Есть идеи?

10000