Предикати во C++
Предикат е покажувач на функција или функција објект (предмет кој со повик на функција, оператор () ()), кој дава да / не одговори на прашањето за објектот. многу алгоритми користат предикат да се донесе одлука за секој елемент тие работат на, предикатот се користи како што следува:
if( pred( *first ) ) { /* ... */ }
Како што можете да видите од овој пример, pred треба да врати вредност што може да се тестира како вистина. Имајте на ум дека предикатот е дозволено да користи const функции само преку dereferenced iterator. Некои предикати се бинарни, односно, тие се два предмети (често dereferenced iterators) како аргументи. Ова значи дека бинарен предикатната bpred треба да работи правилно кога се користи како што следува:
if( bpred( *first1, *first2 ) ) { /* ... */ }
имплементација find_if од стандардниот алгоритам (стандардната библиотека на алгоритми)
template<typename Iter, typename Pred> inline Iter find_if( Iter first, Iter last, Pred pred ) { while( first != last && !pred(*first) ) { ++first; } return first; }
Find_if е функција која прима на влез два итератори, и предикат односно функција предикат која ќе прави некоја проверка и ќе враќа вредност во зависност од проверката.
Покажувач на функција
bool GreaterThanFive( int i ) { return i > 5; } bool IsAnyElementGreaterThanFive( vector<int>& v ) { return find_if( v.begin(), v.end(), GreaterThanFive ) != v.end(); }
Објект на функција
class GreaterThanFive : public std::unary_function<int, bool> { public: bool operator()( int i ) const { return i > 5; } }; bool IsAnyElementGreaterThanFive( vector<int>& v ) { return find_if( v.begin(), v.end(), GreaterThanFive() ) != v.end(); }
Генерализирана функција
class GreaterThan : public std::unary_function<int, bool> { public: GreaterThan( int value ) : value_( value ) { } bool operator()( int i ) const { return i > value_; } private: const int value_; }; bool IsAnyElementGreaterThanFive( vector<int>& v ) { return find_if( v.begin(), v.end(), GreaterThan(5) ) != v.end(); }
Ова предикатна GreaterThan функција има член што ја памти неговата вредност, во овој случај тоа е вредноста што треба да се споредува со секој елемент тоа е const int value_.