Стандартные предикаты для STL count_if - PullRequest
12 голосов
/ 19 июля 2010

Я использую функцию STL count_if для подсчета всех положительных значений в векторе двойных чисел.Например, мой код выглядит примерно так:

 vector<double> Array(1,1.0)

 Array.push_back(-1.0);
 Array.push_back(1.0);  

 cout << count_if(Array.begin(), Array.end(), isPositive);

, где функция isPositive определена как

 bool isPositive(double x) 
 {
     return (x>0); 
 }

. Следующий код вернет 2. Есть ли способ выполнить вышеописанное без записимоя собственная функция isPositive?Есть ли встроенная функция, которую я мог бы использовать?

Спасибо!

Ответы [ 4 ]

32 голосов
/ 19 июля 2010

std::count_if(v.begin(), v.end(), std::bind1st(std::less<double>(), 0)) - это то, что вы хотите.

Если вы уже using namespace std, более понятная версия будет читать

count_if(v.begin(), v.end(), bind1st(less<double>(), 0));

Все это относится к заголовку <functional>,наряду с другими стандартными предикатами.

12 голосов
/ 19 июля 2010

Если вы компилируете с MSVC ++ 2010 или GCC 4.5+, вы можете использовать real лямбда-функции:

std::count_if(Array.begin(), Array.end(), [](double d) { return d > 0; });
7 голосов
/ 19 июля 2010

Я не думаю, что есть встроенная функция.Тем не менее, вы можете использовать boost lambda http://www.boost.org/doc/libs/1_43_0/doc/html/lambda.html, чтобы написать это:

cout << count_if(Array.begin(), Array.end(), _1 > 0);
1 голос
/ 19 июля 2010
cout<<std::count_if (Array.begin(),Array.end(),std::bind2nd (std::greater<double>(),0)) ;  
greater_equal<type>()  -> if >= 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...