如何将变量与向量中包含的对象的成员变量进行比较

时间:2018-11-10 22:24:27

标签: c++ operator-overloading

我有一个std::vector<StudentGradeInfo> gradebook;类的向量StudentGradeInfo对象。 StudentGradeInfo类包含以下成员变量: std::string studentName; int studentID; std::string major;

我需要做的是重载==运算符,以比较来自用户的ID输入并将其与向量studentID中对象的std::vector<StudentGradeInfo> gradebook;成员变量进行比较。

我将如何遍历向量以比较ID?这可能是非成员函数,因为它正在将int变量与对象的成员函数进行比较,但是我不知道该怎么做。

2 个答案:

答案 0 :(得分:1)

如果您绝对必须制作一个超载的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) {
        //...
    } 
}

答案 1 :(得分:0)

我想您想遍历向量以找到具有特定ID的studentGrandeInfo对象。通过将std::find_if与lambda函数一起使用以进行适当的比较,您可以轻松完成此操作。代码如下:

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所指出的那样,在某种程度上是不切实际的,因为它意在比较两个相同类型的对象(而不是一个int对象)。请参见以下代码对此进行说明:

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;
    }

}