1

これが私の質問のコンテキストを設定するコードのスニペットです(これは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(またはそのことについては標準ライブラリ)は、属性の値によってリスト内のアイテムの数を数えるために私が見落としていたかもしれない何かを提供しますか?

4

1 に答える 1

7

std::count_ifと適切な述語を使用します。たとえば、 C ++ 11でのがのPersonオブジェクトの数を見つけるには、ageAge_ADULT

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
);
于 2011-05-19T17:29:37.233 に答える