Как составить функторы с STL?

В STL возможно следующее:

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

Это возвращает количество элементов в v, которые меньше 3. Как составить функтор, который возвращает количество элементов от 0 до 3? Я знаю, что у boost есть некоторые возможности для этого, но возможно ли это в чистом STL?

4

Решение

Если вы имеете в виду, используя средства компоновки функторов стандартной библиотеки, то нет, по крайней мере, не в 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 разрешены, то, возможно, самым простым способом будет лямбда, не нужно создавать сложную композицию функторов (самостоятельно):

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

Но для C ++ 98 Chubsdadответ, наверное, лучшее решение.

8

Другие решения

Это то, что вы спрашиваете? Я знаю, что это не чистый 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));
}
5