【问题标题】:How to access specified fields value of a struct using operator[]如何使用 operator[] 访问结构的指定字段值
【发布时间】:2018-08-27 13:27:23
【问题描述】:

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

struct pBanana {        
        bool free;          
    };

现在我有了另一个包含 pBanana 结构向量的结构

struct handler_toto {

    std::vector<pBanana > listBananas;

};

现在我想返回 listBananas 中 boolean free 为 false 的次数

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

在咨询了documentation 之后,我很难理解如何在我的情况下正确使用operator[]

【问题讨论】:

    标签: c++ vector


    【解决方案1】:

    那是因为您不能使用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 的次数。

    【讨论】:

    • 请原谅我的 C++ 知识,感谢您有兴趣提供帮助!
    • "您不能使用 operator[] 来执行此操作" - 可以,您只需手动循环遍历向量。 std::count_if() 只是为你做循环。
    • 您的 lambda 需要使用 return !b.free; 代替,因为 OP 想要计算布尔值的数量为 false,而不是 true
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-03
      • 2019-07-10
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多