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

Вот фрагмент кода, устанавливающий контекст для моего вопроса (это 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;

После заполнения списка людей, я хотел бы получить подсчет количества элементов в спискеопределенного пола или возраста.Я знаю, что могу просто перебрать список и посчитать вручную, но я надеялся, что где-то может быть лучше оптимизированная версия такого алгоритма.Я читал об аккумуляторе счетчика бустов, но не уверен, что смогу использовать его в этой конкретной ситуации.

Предлагает ли буст (или стандартная библиотека в этом отношении) что-то, что я мог упустить из виду для подсчета числаэлементов в списке по значению атрибута?

1 Ответ

7 голосов
/ 19 мая 2011

Используйте std :: count_if и подходящий предикат.Например, чтобы найти число Person объектов с age из Age_ADULT в C ++ 11,

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