4

在 STL 中可以进行以下操作:

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

这将返回 v 中小于 3 的元素数。如何组成一个返回 0 到 3 之间元素数的函子?我知道 boost 对此有一些设施,但在纯 STL 中是否有可能?

4

2 回答 2

8

如果您的意思是使用标准库的函子组合工具,那么不会,至少在 C++98 中不会。在 C++11 中,您可以使用std::bind任意组合的函子:

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 功能,那么最简单的方法可能是 lambda,无需(您自己)制作复杂的函子组合:

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 回答