这是一段代码,将上下文设置为我的问题(这是C ++)
enum Gender { Gender_MALE, Gender_FEMALE, Gender_UNKNOWN };
enum Age { Age_CHILD, Age_ADULT, Age_SENIOR, Age_UNKNOWN };
struct Person {
int id;
Gender gender;
Age age;
};
std::list<Person> people;
在填写人员列表后,我想获得列表中有多少项具有特定性别或年龄的记录。我知道我可以简单地遍历列表并手动计数,但我希望在某处可能有更好的优化版本的这种算法。我读到了有关增强计数累加器的信息,但我不确定在这种情况下我是否可以使用它。
boost(或标准库)是否提供了一些我可能忽略的东西,用属性值计算列表中的项目数?
答案 0 :(得分:7)
使用std::count_if和合适的谓词。例如,在C ++ 11中查找Person
age
Age_ADULT
的{{1}}个对象,
std::count_if(
people.cbegin(),
people.cend(),
[](Person const& p){ return p.age == Age_ADULT; }
);
对于C ++ 03,
std::count_if(
people.begin(),
people.end(),
boost::bind(&Person::age, _1) == Age_ADULT
);