目录
1.functor仿函数简介
- 仿函数是STL中最简单的部分,存在的本质就是为STL算法部分服务的,一般不单独使用。
- 仿函数(functors)又称为函数对象(function objects),虽然函数指针虽然也可以作为算法的参数,但是函数指针不能满足STL对抽象性的要求,且无法和STL其他组件搭配
- 仿函数就是使一个类的使用看上去像一个函数,其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了,本质就是类重载了一个operator(),创建一个行为类似函数的对象。
- 对于重载了()操作符的类,可以实现类似函数调用的过程,所以叫做仿函数,实际上仿函数对象仅仅占用1字节,因为内部没有数据成员,仅仅是一个重载的方法而已。
- 实际上可以通过传递函数指针实现仿函数类似的功能,但是为了和STL内部配合使用,他提供了仿函数的特性。
2 仿函数的分类
标准库目前提供了约有24个仿函数,分为算数类、逻辑运算类、相对关系类。
2.1 算术类仿函数
操作 | 仿函数 |
---|---|
加 | plus |
减 | minus |
乘 | multiplies |
除 | divides |
取模 | modulus |
取反 | negate |
使用 multiplies 乘 仿函数:
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
int func(){
static int i=1;
return i++;
}
/*
int mulitply(int res,int n){
return res*n;
}
*/
int main(){
vector<int> vec(10);
generate(vec.begin(),vec.end(),func);
for(auto n:vec){
cout << n << " ";
}
cout << endl;
// int res = accumulate(vec.begin(),vec.end(),1,mulitply);
int res = accumulate(vec.begin(),vec.end(),1,multiplies<int>()); // 使用STL中的仿函数
cout << res << endl;
}
运行结果:
1 2 3 4 5 6 7 8 9 10
3628800
2.2 关系运算类仿函数
操作 | 仿函数 |
---|---|
等于 | equal_to |
不等于 | not_equal_to |
大于 | greater |
大于等于 | greater_equal |
小于 | less |
小于等于 | less_equal |
2.3 逻辑运算仿函数
操作 | 仿函数 |
---|---|
逻辑与 | logical_and |
逻辑或 | logical_or |
逻辑否 | logical_not |
3 仿函数使用
下图中myclass是我们自己写的仿函数,但是由于没有继承仿函数的公共父类,所以就不能融入到STL中。
4 仿函数可适配的条件
如果我们要自己写仿函数,并且融入到STL中, 就必须继承两个中的一个父类(两个操作符的父类或者一个操作符的父类),只有继承了才能被适配器去修饰和改造。