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

Я пытаюсь использовать функцию 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 ]

3 голосов
/ 16 января 2020

Вам нужно добавить 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

2 голосов
/ 16 января 2020

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...