如何使用operator []

时间:2018-03-19 03:16:26

标签: c++ vector

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

struct pBanana {        
        bool free;          
    };

现在我有另一个包含pBanana struct

矢量的结构
struct handler_toto {

    std::vector<pBanana > listBananas;

};

现在我想回复listBananas中布尔值免费错误的次数

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

在咨询documentation后,我无法理解如何在我的案例中正确使用operator[]

2 个答案:

答案 0 :(得分:2)

那是因为您无法使用operator[]来执行此操作。

您可以使用std::count_if(不是count)和 lambda函数 a.k.a. 匿名函数执行此操作:

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

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

答案 1 :(得分:1)

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