YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

STLで関数オブジェクトを作る

最近C++を書いていてSTLを使うことが多いので、いろいろとサンプルを探してみたんだけど、俺の頭が馬鹿すぎて例文を読んでもいまいち分からなかった。で、ようやく意味が分かったのでメモ。Templateを使わない例ですので、使うときは適宜読み替える。*1例えばこんな例。

typedef struct {
    int country_id;
    int city_id;
    int member_id;
    string name;
} Member;

struct country_city {
    int _country;
    int _city;
    country_city(const int& _l, const int& _r){ //構造体のコンストラクタ
        _country = _l;
        _city = _r;
    }

    bool operator()(const Member& m) const {
        return (_country == m.country_id && _city == m.city_id)
    }
}

上の例ではMemberという構造体のvectorがあるとして、find_ifを使って国コードと都市コードが一致するメンバーを探したいというときに必要な関数オブジェクトcountry_cityを作成した例。コレによって、

std::vector<Member> members;
/*
membersに実際に値を入れる処理
*/
std::vector<Member>::iterator first = member.begin();
std::vector<Member>::iterator last  = member.end();
std::vector<Member>::iterator itr;
itr = std::find_if( first, last, country_city(10, 15) );

しかし、単なる構造体に過ぎないって事に気が付くのに一晩かかってしまった。寝て起きたらすぐ気が付いたけど。

*1:あくまで自分の理解です。もっと良い方法があったら教えて。