Predicate是一种特殊的辅助函数,它会返回Boolean,常常被用来作为排序或者查找准则。
Predicate会有1个或者2个操作数。
Unary Predicate(单参判断式)
例子:
我们先写一个算法,如下:
MathUtil.h
#ifndef _Math_Util_H_ #define _Math_Util_H_ using namespace std; class MathUtil { public: static bool isPrime(int number); }; #endif
MathUtil.cpp
#include <string> #include "MathUtil.h" bool MathUtil::isPrime(int number) { // ignore negative sign number = abs(number); // 0 and 1 are no prime numbers if (number == 0 || number == 1) { return false; } // find divisor that divides without a remainder int divisor; for (divisor = number / 2; number%divisor != 0; --divisor) { ; } // if no divisor greater than 1 is found, it is a prime number return divisor == 1; }
测试代码
PredicateTest.cpp
#include <list> #include <algorithm> #include <iostream> #include "../../Algorithm/MathUtil.h" #include "PredicateTest.h" using namespace std; void PredicateTest::unaryPredicate() { list<int> coll; int startNumber, endNumber; cout << "Input Start Number: " << endl; cin >> startNumber; cout << "Input End Number: " << endl; cin >> endNumber; // insert elements from start number to end number for (int i = startNumber; i <= endNumber; ++i) { coll.push_back(i); } // search for prime number auto pos = find_if(coll.cbegin(), coll.cend(), // range MathUtil::isPrime); // predicate if (pos != coll.end()) { // found cout << *pos << " is first prime number found" << endl; } else { // not found cout << "no prime number found" << endl; } } void PredicateTest::run() { printStart("unaryPredicate()"); unaryPredicate(); printEnd("unaryPredicate()"); }
运行结果:
---------------- unaryPredicate(): Run Start ----------------
Input Start Number:
30
Input End Number:
50
31 is first prime number found
---------------- unaryPredicate(): Run End ----------------