2010-07-19 14 views
12

Sto utilizzando la funzione STL count_if per contare tutti i valori positivi in un vettore di doppi. Per esempio il mio codice è qualcosa di simile:predicati standard per 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); 

in cui la funzione è definita come isPositive

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

Il seguente codice restituirebbe 2. C'è un modo di fare quanto sopra senza scrittura la mia propria funzione isPositive? È possibile utilizzare una funzione integrata ?

Grazie!

+0

Ecco un elenco: http://msdn.microsoft.com/en-us /library/4y7z5x4b(v=VS.71).aspx – sje397

risposta

32

std::count_if(v.begin(), v.end(), std::bind1st(std::less<double>(), 0)) è quello che volete.

Se sei già using namespace std, la versione più chiara legge

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

Tutta questa roba appartiene alla intestazione <functional>, insieme ad altri predicati standard.

+9

Oppure potresti 'bind2nd (maggiore (), 0)'. La scelta è tua! –

+0

Dato che sta già usando 'namespace std;' sarebbe più chiaro senza tutti i prefissi 'std ::'. – sje397

+0

Una soluzione elegante. Cosa succede se devo anche contare tutti i valori non negativi? – Wawel100

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

Se si compila con MSVC++ 2010 o GCC 4.5+ è possibile utilizzare reali funzioni lambda:

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