概念:c++STL中內建了一些函式物件
分類:
- 算術仿函式
- 關係仿函式
- 邏輯仿函式
用法:
- 這些仿函式所產生的物件,用法和一般函式完全相同
- 使用內建函式物件,需要使用標頭檔案#include<functional>
1.算術仿函式
功能描述:
- 實現四則運算
- 其中negate是一元運算,其他都是二元運算
仿函式原型:
- template<class T> T plus <T> //加法仿函式
- template<class T> T minus<T> //減法仿函式
- template<class T> T multiplies<T> //乘法仿函式
- template<class T> T divides<T> //除法仿函式
- template<class T> T modulus<T> //取模仿函式
- template<class T> T negate<T> //取反仿函式
例項程式碼:
#include <iostream> using namespace std; #include <functional> void test01() { //negate一元仿函式,取反 negate<int> v; cout << v(50) << endl; } void test02() { //plus二元仿函式,加法 plus<int> v; cout << v(10, 20) << endl; } int main() { //結果:-50 30 test01(); test02(); }
2.關係仿函式
功能描述:
- 實現關係對比
仿函式原型:
- template<class T> bool equal_to<T> //等於
- template<class T> bool not_equal_to<T> //不等於
- template<class T> bool greater<T> //大於
- template<class T> gretaer_equal<T> //大於等於
- template<class T> less<T> //小於
- template<class T> less_equal<T> //小於等於
例項程式碼:
#include <iostream> #include <vector> using namespace std; #include <functional> //自定義仿函式 class myCompare { public: bool operator()(int v1, int v2) { return v1 > v2; } }; void printVector(vector<int> &v) { for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { vector<int> v; v.push_back(40); v.push_back(20); v.push_back(10); v.push_back(30); v.push_back(50); printVector(v); //升序排列 sort(v.begin(), v.end()); printVector(v); //降序排列,使用自定義的仿函式 sort(v.begin(), v.end(), myCompare()); printVector(v); //降序排列,使用內建的仿函式 sort(v.begin(), v.end(), greater<int>()); printVector(v); } int main() { test01(); }
結果:
40 20 10 30 50
10 20 30 40 50
50 40 30 20 10
50 40 30 20 10
3.邏輯仿函式
功能描述:
- template<class T> bool logical_and<T> //邏輯與
- template<class T> bool logical_or<T> //邏輯或
- template<class T> bool logical_not<T> //邏輯非
例項程式碼:
#include <iostream> #include <vector> using namespace std; #include <functional> void printVector(vector<bool> &v) { for (vector<bool>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << " "; } cout << endl; } void test01() { vector<bool> v; v.push_back(true); v.push_back(false); v.push_back(true); v.push_back(false); printVector(v); //使用邏輯非,將容器v搬運到容器v2中,並執行取反操作 vector<bool> v2; v2.resize(v.size()); transform(v.begin(),v.end(),v2.begin(),logical_not<bool>()); printVector(v2); } int main() { test01(); }
結果:
1 0 1 0
0 1 0 1