文章目錄
- 一、Lambda表達式是什么?
- 二、程序示例
- 1. 在STL中的使用
一、Lambda表達式是什么?
Lambda表達式時C++11引入的語法,本質上是一個匿名函數,用[ ] () {}三個符號組成表達式。
格式為:[capture list] (params list) mutable exception-> return type { function body }
其中:
1:capture list為捕獲外部變量列表。
2:params list表示形參列表。
3:mutable 表示是否修改捕獲的變量,可選擇加還是不加。
4:exception表示異常設定,一般不使用。
5:return type表示返回值類型。
6:function body 運行的函數。
該表達式在運行過程中由[capture list]先進行外部變量的捕獲,捕獲方法包括值傳遞捕獲,地址傳遞捕獲,表達式自行推導捕獲。
值傳遞捕獲:
int a = 10;[a](){return a/2; };cout << "a=" << a << endl;
a=10
發現無論怎么處理變量和函數,都無法更改a的值。
但是我們給lambda表達式賦一個auto類型的變量,然后可以用函數調用的方式去調用這個auto變量,返回值類型為int,就可以實現c=a/10的功能。
所以由此可以看出,lambda表達式本質上就是一個函數,如果形參列表()為空,就表明為無參函數。對無參的lambda表達式表達式來講。
int a = 10;//返回類型為int,故在調用b()可以用int類型接收auto b = [a]()->int {return a / 10; }; int c = b();cout << "c=" << c << endl;
c=1
地址傳遞捕獲
int a = 10;int b = 10;//a以值捕獲,b以地址捕獲auto c = [a,&b]()->int{b = a+b; return b; };int d = c();cout << "d=" << d << endl;
d=20
自行推導捕獲
[=] 表示用值傳遞的方式捕獲所有變量。
[this] 捕獲所在類內的this指針。
二、程序示例
1. 在STL中的使用
//以引用和值傳遞的方式給容器賦值,算法采用generategenerate(v.begin(), v.end(), [i, &j]() {j= i + j;return j;});//以地址傳遞的方式遍歷容器的值,同時按照x = x * i+ j的公式更改容器的值。for_each(v.begin(), v.end(), [=](int &x) {x = x * i+ j;cout << "x=" << x << endl;});//實現降序排列sort(v.begin(), v.end(), [](const int& a,const int& b){return a>b;});