在 STL 中可以进行以下操作:
int count = count_if(v.begin(), v.end(), bind2nd(less<int>(), 3));
这将返回 v 中小于 3 的元素数。如何组成一个返回 0 到 3 之间元素数的函子?我知道 boost 对此有一些设施,但在纯 STL 中是否有可能?
在 STL 中可以进行以下操作:
int count = count_if(v.begin(), v.end(), bind2nd(less<int>(), 3));
这将返回 v 中小于 3 的元素数。如何组成一个返回 0 到 3 之间元素数的函子?我知道 boost 对此有一些设施,但在纯 STL 中是否有可能?
如果您的意思是使用标准库的函子组合工具,那么不会,至少在 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的答案可能是最好的解决方案。
这是你问的吗?我知道这不是纯 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));
}