2010-07-19 16 views
12

Używam funkcji STL count_if do zliczania wszystkich dodatnich wartości w wektorze dubletów. Na przykład mój kod jest coś takiego:Standardowe predykaty dla 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); 

gdzie isPositive funkcja jest zdefiniowana jako

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

poniższy kod powrotu 2. Czy istnieje sposób robienia powyższy bez napisać własną funkcję isPositive? Czy jest dostępna wbudowana funkcja ?

Dzięki!

+0

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

Odpowiedz

32

std::count_if(v.begin(), v.end(), std::bind1st(std::less<double>(), 0)) to, co chcesz.

jeśli jesteś już using namespace std, tym wyraźniej wersja brzmi

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

Wszystkie te rzeczy należą do nagłówka <functional>, obok innych standardowych predykatów.

+9

Lub możesz 'bind2nd (większy (), 0)'. Wybór nalezy do ciebie! –

+0

Biorąc pod uwagę, że już używa 'namespace std;' byłby bardziej przejrzysty bez wszystkich prefiksów 'std ::'. – sje397

+0

Eleganckie rozwiązanie. Co się stanie, jeśli będę musiał liczyć wszystkie wartości nieujemne? – Wawel100

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

Jeśli kompilujesz z MSVC++ 2010 lub GCC 4.5+ można używać funkcji rzeczywistych lambda:

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