2010-07-19 7 views
12

J'utilise la fonction STL count_if pour compter toutes les valeurs positives dans un vecteur de doubles. Par exemple, mon code est quelque chose comme:Prédicats standard pour 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); 

où la fonction isPositive est définie comme

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

Le code suivant renverrait 2. Y at-il une façon de faire la ci-dessus sans ecris mon propre fonction isPositive? Y a-t-il une fonction intégrée que je pourrais utiliser?

Merci!

+0

Voici une liste: http://msdn.microsoft.com/en-us /library/4y7z5x4b(v=VS.71).aspx – sje397

Répondre

32

std::count_if(v.begin(), v.end(), std::bind1st(std::less<double>(), 0)) est ce que vous voulez.

Si vous êtes déjà using namespace std, la version plus claire lit

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

Tout ce genre de choses appartient à l'en-tête <functional>, aux côtés d'autres prédicats standard.

+9

Ou vous pourriez 'bind2nd (plus grand (), 0)'. Le choix t'appartient! –

+0

Étant donné qu'il utilise déjà namespace std; 'il serait plus clair sans tous les préfixes' std :: '. – sje397

+0

Une solution élégante. Et si j'ai aussi besoin de compter toutes les valeurs non négatives? – Wawel100

1
cout<<std::count_if (Array.begin(),Array.end(),std::bind2nd (std::greater<double>(),0)) ; 
greater_equal<type>() -> if >= 0 
12

Si vous compilez avec MSVC++ 2010 ou GCC 4.5+ vous pouvez utiliser fonctions réelles lambda:

std::count_if(Array.begin(), Array.end(), [](double d) { return d > 0; });