lambda 表達式(又稱爲 lambda)就像一個匿名函數,保持狀態並可訪問封閉範圍可用的變量。 它是通過定義一個類並構造該類型對象而實現的。
看了一下lambda的教程,現總結一下。
一、lambda表達式
() 參數列表
{} 函數體
二、lambda表達式可以這麼寫
[](){};
這段簡短的代碼是可以編譯運行的。[] 捕獲列表沒有內容,()表示沒有參數傳遞進去。{}表示函數體沒有內容。還可以簡寫如下
[]{};
參數沒有內容,可以省略()所表示的參數列表。簡寫成了這樣。下面看具體例子。
三、例子
1、lambda表達的函數體如果想要使用外部的變量,需要在捕獲列表中聲明一下。
int i = 10;
[]
{
//cout << i << endl;錯誤例子,不能通過編譯。因爲i沒有寫到捕獲列表裏面去。
}();
//正確例子
int i = 10;
[i]
{
cout << i << endl; //正確,捕獲列表已經聲明瞭i,所以函數體可以使用i
}();
函數體內要使用外部的變量,是需要在捕獲列表裏面聲明的,可以聲明爲值類型,或者引用類型。這裏是值類型。
同時,可以看到,在函數體後面都有一個小括號(),這個小括號,是表示調用了這個lambda表達式。
2、捕獲列表可以捕獲多個變量。
{
int x = 10, y = 20, z = 30;
[x, y, z]
{
cout << "x=" << x << ",y=" << y << ",z=" << z << endl;
}();
}
捕獲列表聲明瞭x,y,z,所以函數體可以使用x,y,z,同時,在函數體後面寫上(),調用它,從而能夠打印值便於查看。
3、通過“=”號來捕獲值
{
int x = 10, y = 20, z = 30, q = 40, p = 50;
[=]//捕獲列表寫成“=”
{
cout << "x=" << x << endl;
cout << "y=" << y << endl;
cout << "z=" << z << endl;
cout << "q=" << q << endl;
cout << "p=" << p << endl;
}();
}
有時候,需要傳遞更多的值進去,就會導致捕獲列表變大,可以使用“=”,一次性捕獲所有的變量值。在函數體後面寫上(),調用它,從而能夠打印值便於查看。
4、參數列表的使用
{
int x = 20;
char *name = "helloworld";
[x](char *n)//參數列表(char *n)
{
cout << n << endl;
}(name); //調用的時候需要傳遞參數。
}
要使用參數列表,需要在捕獲列表後面寫明白,例如,要傳遞一個char *的參數到lambda的函數體裏面,需在[x]後面寫上(char *n),隨後傳遞參數並調用它,後面的小括號()就不再是空的,而是有參數的(name)。
5、lambda函數體,改變捕獲列表的值
{
int x = 20;
[x]
{
x++;//錯誤,因爲捕獲列表是捕獲了值,捕獲值是不能修改它的。要捕獲引用才能修改值。
cout << "x=" << x << endl;
}();
}
{
int x = 20;
[&]//使用&表明,要捕獲外部所有變量的引用
{
x++;//正確,此時能修改x的值
cout << "x=" << x << endl;
}();
}
6、通過變量保持lambda表達式的地址。
{
auto fun = []{cout << "helloworld" << endl; };//此時最後面不必寫()。
fun();//調用lambda
}
此時,已經不用在函數體後面寫上小括號(),因爲有了變量保存了lambda的地址,從而通過變量來調用它。
以上是對lambda的人門總結。