C++标准库分析总结(十)——<仿函数/函数对象>

目录

1.functor仿函数简介   

2 仿函数的分类

2.1 算术类仿函数

2.2 关系运算类仿函数

2.3 逻辑运算仿函数

3 仿函数使用

4 仿函数可适配的条件






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中, 就必须继承两个中的一个父类两个操作符的父类或者一个操作符的父类),只有继承了才能被适配器去修饰和改造。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值