C++實例詳解lambda表達式的使用
lambda表達式
- C++11 函數(shù)對象的升級版 =》 lambda表達式
- 函數(shù)對象的缺點:(需要定義一個類)
- 函數(shù)對象使用在 泛型算法參數(shù)傳遞 比較性質/自定義操作 優(yōu)先級隊列 智能指針(自定義智能指針的刪除器)
lambda表達式原理: 就是函數(shù)對象更高級的實現(xiàn)!
1、lambda表達式語法
例1:
lambda表達式對應函數(shù)對象小括號重載函數(shù)的。
- []為空,相當于構造函數(shù)不接收任何外部傳進來的變量。
- ()是運算符重載函數(shù),具體接收的參數(shù)的個數(shù)
- 然后是返回值,看是無類型還是其他類型。
- 最后是函數(shù)代碼
[]不為空,相當于構造函數(shù)接收任何外部傳進來的變量a,b。
例2:
如果lambda表達式的返回值不需要,那么"->返回值"可以省略的
[捕獲外部變量]
[]:表示不捕獲任何外部變量
[=]:以傳值的方式捕獲外部的所有變量
[&]:以傳引用的方式捕獲外部的所有變量
[this]:捕獲外部的this指針
[=,&a]:以傳值的方式捕獲外部的所有變量,但是a變量以傳引用的方式捕獲
[a, b]:以值傳遞的方式捕獲外部變量a和b
[a, &b]:a以值傳遞捕獲,b以傳引用的方式捕獲
值傳遞:
加上mutable,表示將值傳遞的形參a,b改掉;不影響外部的實參。
引用傳遞:
修改的是實參,不需要加mutable
2、lambda應用
例1—從大到小排序
例2—按序插入元素65
例3—for_each
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { vector<int> vec; for (int i = 0; i < 20; i++) { vec.push_back(rand() % 100 + 1); } sort(vec.begin(), vec.end(), [](int a, int b)->bool { return a > b; }); for (int val : vec) { cout << val << " "; } cout << endl; //65按序插入序列 要找第一個小于65的數(shù)字 auto it = find_if(vec.begin(), vec.end(), [](int a)->bool {return a < 65; }); if (it != vec.end()) { vec.insert(it, 65); } for (int val : vec) { cout << val << " "; } cout << endl; for_each(vec.begin(), vec.end(), [](int a) { if (a % 2 == 0) cout << a << " "; }); cout << endl; return 0; }
3、lambda表達式的應用實踐
既然lambda表達式只能使用在語句當中,如果想跨語句使用之前定義好的lambda表達式,怎么辦?用什么類型來表示lambda表達式?
- lambda表達式 =》 函數(shù)對象 用function類型綁定它
- 用function類型表示函數(shù)對象的類型
- bind綁定器綁定的結果依然還是一個函數(shù)對象;
1、計算器案例
2、智能指針案例
3、優(yōu)先級隊列
上面寫法靈活性太差。現(xiàn)在優(yōu)化:
priority_queue本身就有3個模板參數(shù),分別是元素類型、容器類型、函數(shù)對象。
可以接收外部自定義的函數(shù)對象:
#include <iostream> #include <functional> #include <queue> using namespace std; class Data { public: Data(int val1 = 10, int val2 = 10) :ma(val1), mb(val2) {} int ma; int mb; }; int main() { //優(yōu)先級隊列 //priority_queue<Data> queue; using FUNC = function<bool(Data&, Data&)>; priority_queue<Data, vector<Data>, FUNC> maxHeap([](Data& d1, Data& d2)->bool { return d1.mb > d2.mb; }); maxHeap.push(Data(10, 20)); maxHeap.push(Data(15, 15)); maxHeap.push(Data(20, 10)); return 0; }
到此這篇關于C語言實例詳解lambda表達式的使用的文章就介紹到這了,更多相關C語言lambda內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!