函数对象
- 函数对象概念
- 谓词
- 概念
- 内建函数对象
- 算术仿函数
- 关系仿函数
- 逻辑仿函数(基本用不到)
函数对象概念
重载函数调用操作符的类,其对象常称为函数对象,函数对象使用重载的()时。行为类似函数调用,也叫仿函数。
函数对象(仿函数)是一个类,不是一个函数。
使用特点:
函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值。函数对象超出普通函数的概念,函数对象可以有自己的状态,函数对象可以作为参数传递。
//函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值。
class myAdd {
public:int operator()(int a, int b) {return a + b;}
};
//函数对象超出普通函数的概念,函数对象可以有自己的状态
class B {
public:int count;//内部自己的状态B(){count = 0;}void operator()(string s) {cout << s << endl;this->count++;}};
//函数对象可以作为参数传递
void doP(B& b1, string b2) {b1(b2);
}
void test() {myAdd ma;cout << ma(10, 10) << endl;B b2;b2("dasfafasfg");b2("dasfafasfg");b2("dasfafasfg");b2("dasfafasfg");cout << "次数:" << b2.count << endl;B b3;doP(b3, "C++");
}
谓词
概念
返回bool类型的仿函数称为谓词,如果operator()接受一个参数,叫做一元谓词;如果operator()接受两个参数,叫做二元谓词。
一元谓词:
class CreateN {
public:bool operator()(int val) {return val > 5;}
};
void test() {vector<int> v;for (int i = 0;i < 5;i++) {v.push_back(i);}//查找容器中有没有大于5的数字,CreateN()匿名函数对象vector<int>::iterator it=find_if(v.begin(), v.end(), CreateN());if (it == v.end()) {cout << "没找到" << endl;}else {cout << "找到" << endl;}
}
二元谓词
class myCom {
public:bool operator()(int v, int v1) {return v > v1;}
};
void test() {vector<int> v;v.push_back(10);v.push_back(24);v.push_back(12);v.push_back(35);v.push_back(20);sort(v.begin(),v.end());for (vector<int>::iterator it = v.begin();it != v.end();it++) {cout << *it << endl;}cout << "---------------------" << endl;//使用函数对象改变算法规则,从大到小sort(v.begin(), v.end(),myCom());for (vector<int>::iterator it = v.begin();it != v.end();it++) {cout << *it << endl;}
}
内建函数对象
STL内建了一些函数对象,有算术仿函数、关系仿函数、逻辑仿函数,这些仿函数所产生的对象,用法和一般函数完全相同,使用内建函数对象,需要引入头文件**#include**
算术仿函数
实现四则运算,其中negate是一元运算,其他都是二元运算。
仿函数原型
1、template<class T> T plus < T >
加法仿函数
2、template<class T> T minus < T >
减法仿函数
3、template<class T> T multiplies < T >
乘法仿函数
4、template<class T> T divides < T >
除法仿函数
5、template<class T> T modulus < T >
取模仿函数
6、template<class T> T negate < T >
取反仿函数
void test() {//取反仿函数(一元用法)negate<int> n;cout << n(50) << endl;//加法仿函数(二元用法)plus<int> p;cout << p(10, 34) << endl;
}
关系仿函数
实现关系对比
仿函数原型
1、template<class T> T bool equal_to< T >
等于
2、template<class T> T bool not_equal_to< T >
不等于
3、template<class T> T bool greater< T >
大于(最常用)
4、template<class T> T bool greater_equal< T >
大于等于
5、template<class T> T bool less< T >
小于
6、template<class T> T bool less_equal< T >
小于等于
void test() {...for (vector<int>::iterator it = v.begin();it != v.end();it++) {cout << *it << " ";}cout << endl;//降序 greater<int>()内建函数对象,和自己实现的仿函数效果一样sort(v.begin(), v.end(), greater<int>());
}
逻辑仿函数(基本用不到)
1、template<class T> T bool logical_and< T >
逻辑与
2、template<class T> T bool logical_or< T >
逻辑或
3、template<class T> T bool logical_not< T >
逻辑非
void test() {....cout << endl;cout << "-----------------------------------------" << endl;//利用逻辑非,将容器v搬运到容器v1中,并执行取反操作vector<bool>v1;v1.resize(v.size());transform(v.begin(), v.end(), v1.begin(),logical_not<bool>());//搬运,必须要开辟不骗空间才可使用for (vector<bool>::iterator it = v1.begin();it != v1.end();it++) {cout << *it << " ";}
}