也叫做lambda 函式
, lambda 表示式的出現目的是為了提高編碼效率,但是它的語法卻顯得有點複雜。lambda表示式表示乙個可以執行的**單元,可以理解為乙個未命名的內聯函式。
1. lambda表示式的語法在編寫lambda表示式的時候,可以忽略引數列表和返回值型別,但是前後的捕獲列表和函式體必須包含, 捕獲列表的中括號不能省略,編譯根據它來識別後面是否是lambda表示式
,並且它還有乙個作用是能夠讓lambda的函式體訪問它所處作用域的成員。
//語法
[捕獲列表](引數列表)->返回值型別
()->int{};
//示例1:
(int a ,int b)->int ; //乙個簡單的加法
(int a ,int b) ; //如果能明確返回值型別,那麼 ->int 也可以省略掉
; //如果不需要引數,那麼引數列表頁可以忽略。至此不能再精簡了。
{} ; //這是最精簡的lambda表示式了,不過沒有任何用處,等於乙個空函式,沒有函式體**
2. 傳遞引數和獲取返回值lambda表示式
定義出來並不會自己呼叫,需要手動呼叫。
//1. 接收lambda表示式,然後呼叫
auto f = (int a ,int b)->int;
int result = f(3,4); //呼叫lambda函式,傳遞引數
//2. 不接收,立即呼叫。
int result= (int a ,int b)(3,4); //後面的小括號等同於呼叫這個函式。
3. 捕獲列表的使用labmda表示式需要在函式體中定義,這時如果想訪問所處函式中的某個成員,那麼就需要使用捕獲列表了。捕獲列表的寫法通常有以下幾種形式:形式
作用[a]表示值傳遞方式捕獲變數 a
[=]表示值傳遞方式捕獲所有父作用域的變數(包括this)
[&a]表示引用方式傳遞捕獲變數a
[&]表示引用傳遞方式捕獲所有父作用域的變數(包括this)
[this]表示值傳遞方式捕獲當前的this指標
[=,&a,&b]引用方式捕獲 a 和 b , 值傳遞方式捕獲其他所有變數 (這是組合寫法)
int main(); //值傳遞方式捕獲 a 和 b
cout << f1() << endl; //列印 8
auto f2 = [&a,&b];
cout << f2() << endl; //這裡列印35
cout << "a= "<< a << endl; //再列印一次,a 變成30了
}
4. lambda 的應用場景編寫lamdda表示式很簡單,但是用得上lambda表示式的地方比較特殊。一般會使用它來封裝一些邏輯**,使其不僅具有函式的包裝性,也具有可見的自說明性。在c++ 中,函式的內部不允許在定義函式,如果函式中需要使用到某乙個函式幫助計算並返回結果,**又不是很多,那麼lambda表示式不失為一種上佳選擇。如果沒有lambda表示式,那麼必須在外部定義乙個內聯函式。 來回檢視**稍顯拖沓,定義lambda函式,距離近些,編碼效率高些。 lambda表示式就是內聯的。inline
計算6科考試總成績。
int getcout(vectorscores)
return result;
}int main();
//獲取總成績
int result = getcout(scores);
cout <<"總成績是: "<< result << endl;
}
lambda函式屬於內聯,並且靠的更近,也便於閱讀。
int main();
int result2 = [&]
return result;
}();
cout <<"總成績是2: "<< result2 << endl;
}
C 之lambda表示式
lambda表示式的語法歸納如下 capture子句 在 c 規範中也稱為 lambda 引導 引數列表 可選 可變規範 可選 異常規範 可選 尾隨返回型別 可選 lambda函式體 capture子句 capture子句指定要捕獲的變數以及是通過值還是引用進行捕獲。有與號 字首的變數通過引用訪問,...
c 之Lambda 表示式
1.介紹 lambda 表示式 lambda expression 是乙個匿名函式,lambda 表示式基於數學中的 演算得名,直接對應於其中的 lambda 抽象 lambda abstraction 是乙個匿名函式,即沒有函式名的函式。lambda 表示式可以表示閉包 注意和數學傳統意義上的不同...
C 之Lambda表示式
c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別 可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 mutable ...