假设我有一个带有布尔字段的结构
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;
}