<八>lambda表达是应用实践

既然lambda表达式只能使用在语句中,如果想跨语句使用之前定义好的lambda表达式,怎么办?用什么类型来表示lambda表达式?
用function类型来表示函数对象类型

bind1st/bind2nd bind 绑定器返回的都是 函数对象

lambda表达式=>函数对象

示例1

map<int , function<int(int,int)>>  caculateMap;
caculateMap[1]=[](int a ,int b)->int{return a+b;}
caculateMap[2]=[](int a, int b)->int{return a-b;}
caculateMap[3]=[](int a, int b)->int{return a*b;}
caculateMap[4]=[](int a, int b)->int{return a/b;}

int choice=1;//算法模式选择

cout<<"10+15"<<caculateMap[choice](10,15)<<endl;

示例2 智能指针自定义删除器

#include <iostream>
#include <string>
#include <memory>
#include <functional>
using namespace std;

int main(){


    unique_ptr< FILE, function<void(FILE *)> > upr(fopen("1.txt","W"),[](FILE * file){fclose(file);}) ;


    return 0;
}

关于优先队列代码

#include <iostream>
#include <string>
#include <memory>
#include <functional>
#include <queue>
using namespace std;

class DataType{

public:
   DataType(int _ma,int _mb):ma(_ma),mb(_mb){}

   bool operator >(const DataType & _data)const {return _data.ma> ma ;}
   bool operator <(const DataType & _data)const {return _data.ma< ma ;}
private:
   int ma;
   int mb;

};


int main(){

     priority_queue<DataType> queue;

     queue.push(DataType(10,20));
     queue.push(DataType(15,15));
     queue.push(DataType(20,20));

     system("pause");
     return 0;
}

上面代码对于优先队列,需要在自己的数据类型中定义 >  < , 上面的写法功能性上,OK,没有问题
但是,如果在DataType中写好了operator> operator< 函数,那么对于DataType的比较方式就固定了,不够灵活

可以借助lamabda来优化如下



#include <iostream>
#include <string>
#include <memory>
#include <functional>
#include <queue>
using namespace std;

class DataType{

public:
   DataType(int _ma,int _mb):ma(_ma),mb(_mb){}
   int ma;
   int mb;

};


int main(){


     using pfunciton=function< bool(DataType &d1, DataType &d2)>;
     
     // priority_queue 的构造函数支持传入一个函数对象,那么就把比较大小的 lambad 作为函数对象传入,
     // 这样比较的算法就不用固定写在DataType类中了,更加灵活
     priority_queue<DataType,vector<DataType>,pfunciton> queue([](DataType &d1, DataType &d2)->bool {return d1.ma>d2.ma ;});

     queue.push(DataType(10,20));
     queue.push(DataType(15,15));
     queue.push(DataType(20,20));

     system("pause");
     return 0;
}

原文链接: https://www.cnblogs.com/erichome/p/16967425.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    <八>lambda表达是应用实践

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/4952

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月4日 下午7:10
下一篇 2023年2月4日 下午7:11

相关推荐