lambda表达式实现原理(lambda表达是应用实践)
导读:既然lambda表达式只能使用在语句中,如果想跨语句使用之前定义好的lambda表达式,怎么办?用什么类型来表示lambda表达式? 用function类型来表示函数对象类型...
既然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; }创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!