C/C++编程:lambda与仿函数

1059 篇文章 288 订阅

好的编程语言一般都有好的库支持,C++也是如此。C++语言在标准程序库STL中向用户提供了一些基本的数据结构和一些基本的算法。C++11之前,我们在使用STL算法时,通常会使用一些特别的对象,称之为函数对象或者仿函数。

仿函数就是重新定义了成员函数operator()的一种自定义对象。这样的函数有个特点,就是其使用在代码层感觉根函数的使用并无二样,但其本质并非函数。比如:

class _functor{
public:
    int operator()(int x, int y){ return  x + y}
};

int main(){
    _functor total;
    return total(1, 3);
}

上面的total并不是函数名称,而是对象名称。

相比于函数,仿函数可以拥有初始状态,一般通过class定义私有成员,并在声明对象的时候对其进行初始化。私有成员的状态就成了仿函数的初始状态。而由于声明一个仿函数对象可以拥有多个不同的初始状态的实例,因此可以借由防函数产生多个功能类似缺不同的仿函数实例:


#include <iostream>

class Tax{
private:
    float rate;
    int base;
public:
    Tax(float r, int b) : rate(r), base(b){}
    float operator()(float money) { return (money - base) * rate;}
};

int main(){
    Tax high(0.4, 3000);
    Tax middle(0.25, 2000);
    std::cout << high(35722) << "," << middle(25723);
}

那么lambda函数和仿函数有什么关系呢?


#include <iostream>

class AirportPrice{
private:
    float _dutyfreerate;
public:
    AirportPrice(float rate) : _dutyfreerate(rate){}
    float operator()(float price){
        return price * (1 - _dutyfreerate);
    }
};

int main(){
    float tax_rate = 5.5f;
    AirportPrice changi(tax_rate);
    
    auto changi2 = [tax_rate](float  price)->float{ return price * (1 - tax_rate / 100);};
    
    auto purchaes = changi(3699);
    auto prucha2 = changi2(2899);
}

从上面可以看出,lambda函数捕捉了tax_rate变量,而仿函数以tax_rate初始化类。可以看到,出去语法层面上的不同,lamda函数与仿函数有相同的内涵:都可以捕捉一些变量作为初始状态,并接受参数进行运算。

实际上,仿函数是编译器实现lambda的一种方式。在现阶段,通常编译器会把lamda函数转化成一个仿函数对象。因此,lamda可以视为仿函数的语法糖

实际使用时,可以使用lamdad来代替仿函数来书写代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值