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