Как сравнить переменную с переменными-членами объектов, содержащихся в векторе - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть вектор std::vector<StudentGradeInfo> gradebook; объектов класса StudentGradeInfo. Класс StudentGradeInfo содержит следующие переменные-члены: std::string studentName; int studentID; std::string major;

Что мне нужно сделать, так это перегрузить оператор ==, чтобы сравнить ввод ID от пользователя и сравнить его с studentID переменными-членами объектов в векторе std::vector<StudentGradeInfo> gradebook;.

Как бы я пошел по кругу по вектору для сравнения идентификаторов? Вероятно, это была бы функция, не являющаяся членом, поскольку она сравнивает переменную int с функцией-членом объекта, но я не знаю, как это сделать.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Полагаю, вы могли бы сделать это так, если вам абсолютно необходимо сделать перегрузку operator==.

bool operator==(const StudentGradeInfo& sgi, int id) {
    return sgi.studentID == id; 
}

std::vector<StudentGradeInfo> gradebook;
int id_to_find=1234;

for(auto& sgi : gradebook) {
    if(sgi==id_to_find) {
        //...
    } 
}
0 голосов
/ 11 ноября 2018

Полагаю, вы хотите перебрать вектор, чтобы найти объект studentGrandeInfo с определенным идентификатором. Вы можете сделать это довольно просто, используя std::find_if вместе с лямбда-функцией для правильного сравнения. Код может выглядеть следующим образом:

int toFind = 4219; // some ID
auto it = std::find_if(
gradebook.begin(), gradebook.end(),
[&toFind](const StudentGradeInfo& x) { return x.studentID == toFind;});

В вашем случае, поскольку вы, studentID, по-видимому, выступаете в качестве "уникального ключа", я бы вместо этого использовал структуру данных std::map<int, StrudentGradeInfo>.

Оператор перегрузки == - как указал gsamars - как-то нецелесообразно, поскольку он предназначен для сравнения двух объектов одного типа (а не объекта с целым числом). Смотрите следующий код, иллюстрирующий это:

struct StudentGradeInfo {
    std::string studentName;
    int studentID;

    bool operator==(const StudentGradeInfo& c) const {
        return c.studentID == studentID;
    }
};

int main() {

    std::vector<StudentGradeInfo> gradebook {
        { "john", 123 },
        { "max", 345 }
    };

    StudentGradeInfo aNewOne { "sepp", 345 };
    auto it = find(gradebook.begin(),gradebook.end(),aNewOne);
    if (it == gradebook.end()) {
        cout << "345 does not exist" << endl;
    } else {
        cout << "345 already exists" << endl;
    }

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