2010-07-19 12 views
12

Estoy usando la función STL count_if para contar todos los valores positivos en un vector de dobles. Por ejemplo, mi código es algo como:Predicados estándar para 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); 

donde el isPositive función se define como

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

El siguiente código volvería 2. ¿Hay una manera de hacer lo anterior sin escribiendo mi propia función ¿es positivo? ¿Hay una función incorporada que podría usar?

Gracias!

+0

He aquí una lista: http://msdn.microsoft.com/en-us /library/4y7z5x4b(v=VS.71).aspx – sje397

Respuesta

32

std::count_if(v.begin(), v.end(), std::bind1st(std::less<double>(), 0)) es lo que desea.

Si ya está using namespace std, la versión más clara lee

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

Todo este material pertenece a la cabecera <functional>, junto con otros predicados estándar.

+9

O puede 'bind2nd (mayor (), 0)'. ¡La decisión es tuya! –

+0

Dado que ya está 'usando namespace std;' sería más claro sin todos los prefijos 'std ::'. – sje397

+0

Una solución elegante. ¿Qué pasa si también necesito contar todos los valores no negativos? – Wawel100

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

Si está compilando con MSVC++ 2010 o GCC 4.5+ puede utilizar reales funciones lambda:

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