既然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.uj5u.com/houduan/539510.html
標籤:其他
