c++内建函数对象
概念: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