Использование boost.accumulators для подсчета объектов, для определенного атрибута которых установлено значение

#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
);