4

STL では次のことが可能です。

int count = count_if(v.begin(), v.end(), bind2nd(less<int>(), 3));

これは、3 より小さい v の要素の数を返します。0 から 3 の間の要素の数を返すファンクターをどのように構成しますか? ブーストにはこれのためのいくつかの機能があることは知っていますが、純粋なSTLで可能ですか?

4

2 に答える 2

8

標準ライブラリのファンクター構成機能を使用することを意味する場合は、少なくとも C++98 ではできません。std::bindC++11 では、ファンクターの任意の構成に使用できます。

using std::placeholders;
int count = std::count_if(v.begin(), v.end(), 
                          std::bind(std::logical_and<bool>(), 
                                    std::bind(std::less<int>(), _1, 3), 
                                    std::bind(std::greater<int>(), _1, 0)));

しかし、このような単純な述語の頭痛の種にはなりません。

C++11 の機能が許可されている場合、最も簡単な方法はおそらくラムダであり、複雑なファンクター構成 (自分で) を作成する必要はありません。

int count = std::count_if(v.begin(), v.end(), [](int arg) { 
                          return arg > 0 && arg < 3; });

しかし、C++98 Chubsdadの答えはおそらく最良の解決策です。

于 2012-12-10T11:34:33.313 に答える
5

これはあなたが尋ねるものですか?私はそれが純粋なSTLではないことを知っていますが、それでも..

struct InRange
{
    InRange(int x, int y) : mx(x), my(y) { }
    bool operator()(int x)
    {
        return (x >= mx) && (x <= my);
    }
    int mx, my;
};

int main() {
    std::vector<int> v;
    v.push_back(13);
    v.push_back(14);
    v.push_back(18);
    v.push_back(3);

    int count = std::count_if(v.begin(), v.end(), InRange(0, 3));
}
于 2012-12-10T11:10:05.000 に答える