#c #boost #stl #accumulator
#c #boost #stl #накопитель
Вопрос:
Вот фрагмент кода, задающий контекст для моего вопроса (это 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 count, но я не уверен, что смогу использовать это в данной конкретной ситуации.
Предлагает ли boost (или, если уж на то пошло, стандартная библиотека) что-то, что я, возможно, упустил из виду, для подсчета количества элементов в списке по значению атрибута?
Ответ №1:
Используйте std::count_if и подходящий предикат. Например, чтобы найти количество Person
объектов со значением age
of Age_ADULT
в C 11,
std::count_if(
people.cbegin(),
people.cend(),
[](Person constamp; p){ return p.age == Age_ADULT; }
);
Для C 03,
std::count_if(
people.begin(),
people.end(),
boost::bind(amp;Person::age, _1) == Age_ADULT
);