通过向量中的对象的数据成员迭代

Iterating through data members of an object in a vector

本文关键字:对象 迭代 数据成员 向量      更新时间:2023-10-16

我正在尝试通过id属性在两个类之间实现一种关系。SoccerTeams中的teamId班级必须与managing_directors课程中董事的directorId相同,以便将董事总经理分配给足球队。

两个类分别具有向量teamsman_dirs

class SoccerTeams {
    string teamName;
    int teamId;
    friend class managing_directors;
 public:
    //teams vector
    vector<SoccerTeams> teams;
    void addTeam(string name, int id) {
        SoccerTeams newTeam(name, id);
        teams.push_back(newTeam);
    };
    SoccerTeams(){};
    SoccerTeams(string teamName, int id){
        teamName = teamName;
        teamId = id;
    };
    ~SoccerTeams(){};
};

//managing directors of a soccer team
class managing_directors : public SoccerTeams, public people {
    int directorId;
 public:
    //man_dirs vector
    vector<managing_directors> man_dirs;
    managing_directors(int num_of_managers, int avg_age);
    managing_directors(){};
    ~managing_directors(){};
    void addDirector(string name, char sex, int age, int id) {
        managing_directors newDirector;
        newDirector.name = name;
        newDirector.sex = sex;
        newDirector.age = age;
        newDirector.directorId = id;                        
        man_dirs.push_back(newDirector);
    }; 

我尝试制作一个函数来检查taking_directors类中的团队ID。

int idChecker(int id) {
    for (vector<SoccerTeams>::const_iterator i = teams.begin(); i != teams.end(); ++i) {
        if(i -> teamId == id)
            return 1;
    }
    return 0;
}

但是该函数始终返回0,我认为这是因为它没有检查在主函数中创建的团队向量的相同实例,因为当我尝试在managing_directors类中打印此teams向量时,它是空的。是否可以使teams向量全局?这是解决此问题的正确方法吗?

managing_directors继承的人类的定义(以防万一(

class people {
    string name;
    char sex;
    int age;
    bool under_auth;
    int auth_level;
    friend class managing_directors;
 public:
    people(){};
    ~people(){};    
    virtual int get_age(){ return this->age; }; 
};

更新:

我固定了一个答案中给出的循环,但我认为这不是问题,因为该功能仍然返回0。我尝试使用COUT尝试打印所有ID,而我在输出,它是空的。

我做了这样的事情

int idChecker(int id) {
    for (vector<SoccerTeams>::const_iterator i = teams.begin(); i != teams.end(); ++i) {
        cout << i - > teamId << endl; //test code
        if(i -> teamId == id)
            return 1;
    }
    return 0;
}

您的循环是错误的。在

for (vector<SoccerTeams>::const_iterator i = teams.begin(); i != teams.end(); ++i) {
    if(i -> teamId == id)
        return 1;
    return 0;
}

如果第一个i不匹配,则立即返回0。您需要做的就是将return 0;从for循环中移出,因此在循环找不到匹配时,只有在返回0。给你

int idChecker(int id) {
    for (vector<SoccerTeams>::const_iterator i = teams.begin(); i != teams.end(); ++i) {
        if(i -> teamId == id)
            return 1;
    }
    return 0;
}

您还可以使用基于循环的范围来简化此范围,例如

int idChecker(int id) {
    for (const auto& e : teams)
        if(e.teamId == id)
            return 1;
    return 0;
}

您也可以使用 std::any_of和lambda,例如

int idChecker(int id) {
    return std::any_of(teams.begin(), teams.end()
        [=](const auto& e) { return e.teamId == id; });
}