c++11的lambda入門總結

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的人門總結。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章