如何使用运算符 [] 访问结构的指定字段值



假设我有一个带有布尔字段的结构

struct pBanana {        
        bool free;          
    };

现在我有另一个结构,其中包含 pBanana 结构体的向量

struct handler_toto {
    std::vector<pBanana > listBananas;
};

现在我很想返回列表中布尔值自由为假的次数香蕉

int someFunction (mainHandler& gestionnaire)
{ 
return std::count(gestionnaire.listBananas.begin(), gestionnaire.listBananas.end(), gestionnaire.listBananas.operator[/*How to do it here */]);
}

查阅文档后,我很难低估如何在我的情况下正确使用operator[]

那是因为你不能使用operator[]来做到这一点。

您可以使用std::count_if(不是count(和lambda函数(又名匿名函数(来执行此操作:

return std::count_if(
    gestionnaire.listBananas.begin(),
    gestionnaire.listBananas.end(),
    [](const pBanana &b) {return b.free;});

std::count_if将为列表中的每个项目调用您的函数,并计算它返回true的次数。

使用 std::count_if() ,如 immibis 的答案所示,是最好的选择。

回答您的问题,要正确使用operator[],您必须手动遍历向量,例如:

int someFunction (mainHandler& gestionnaire) {
    int count = 0;
    std::vector<pBanana> &bananas = gestionnaire.listBananas;
    size_t size = bananas.size();
    for(size_t i = 0; i < size; ++i) {
        if (!bananas[i].free) // <-- operator[] called here
            ++count;
    } 
    return count;
}

或者,您可以改用迭代器,而根本不使用operator[]

int someFunction (mainHandler& gestionnaire) {
    int count = 0;
    std::vector<pBanana> &bananas = gestionnaire.listBananas;
    for(std::vector<pBanana>::iterator iter = bananas.begin(); iter != bananas.end(); ++iter) {
        if (!iter->free)
            ++count;
    }
    return count;
}

最新更新