lamnda函式 c 11中的匿名函式

2021-08-11 04:11:08 字數 1545 閱讀 9855

部分**

部分**

部分**

c++11提供了對匿名函式的支援,稱為lambda函式(也叫lambda表示式). lambda表示式具體形式如下:

[capture](parameters)->return-type

為什麼說 lambda 表示式如此激動人心呢?舉乙個例子。標準 c++ 庫中有乙個常用演算法的庫,其中提供了很多演算法函式,比如 sort() 和 find()。這些函式通常需要提供乙個「謂詞函式 predicate function」。所謂謂詞函式,就是進行乙個操作用的臨時函式。比如 find() 需要乙個謂詞,用於查詢元素滿足的條件;能夠滿足謂詞函式的元素才會被查詢出來。這樣的謂詞函式,使用臨時的匿名函式,既可以減少函式數量,又會讓**變得清晰易讀。

比如你**裡有一些小函式,而這些函式一般只被呼叫一次(比如函式指標),這時你就可以用lambda表示式替代他們,這樣**看起來更簡潔些,用起來也方便。

下面舉了幾個lambda函式的例子:  

(int x, int y)  // 隱式返回型別

(int& x) // 沒有return語句 -> lambda 函式的返回型別是'void'

() // 沒有引數,僅訪問某個全域性變數

// 與上乙個相同,省略了()

可以像下面這樣顯示指定返回型別:  

(int x, int y) -> int
在這個例子中建立了乙個臨時變數z來儲存中間值. 和普通函式一樣,這個中間值不會儲存到下次呼叫. 什麼也不返回的lambda函式可以省略返回型別, 而不需要使用 -> void 形式.

lambda函式可以引用在它之外宣告的變數. 這些變數的集合叫做乙個閉包. 閉包被定義在lambda表示式宣告中的方括號內. 這個機制允許這些變數被按值或按引用捕獲.下面這些例子就是:  

//未定義變數.試圖在lambda內使用任何外部變數都是錯誤的.

[x, &y] //x 按值捕獲, y 按引用捕獲.

[&] //用到的任何外部變數都隱式按引用捕獲

[=] //用到的任何外部變數都隱式按值捕獲

[&, x] //x顯式地按值捕獲. 其它變數按引用捕獲

[=, &z] //z按引用捕獲. 其它變數按值捕獲

void test() 

; std::sort(v.begin(), v.end(), (int& v1, int& v2)->bool );

}

需要訪問外部變數時:

void test() 

;int comptimes = 0;

std::sort(v.begin(), v.end(), [&comptimes](int& v1, int& v2)->bool );

}

當我們想引用乙個 lambda 表示式時,我們可以使用auto關鍵字,例如:

auto lambda =  () -> int ;

C 11中的匿名函式(lambda)

c 11提供了對匿名函式的支援,稱為lambda函式 也叫lambda表示式 下面舉了幾個lambda函式的例子 int x,int y 隱式返回型別 int x 沒有return語句 lambda 函式的返回型別是 void 沒有引數,僅訪問某個全域性變數 與上乙個相同,省略了 指定返回型別 in...

c 11匿名函式Lambda

定義乙個lambda函式 auto f capture params opt ret f 呼叫函式其中 capture表示捕獲函式作用域外的外部變數 params是引數 非必須 opt是函式選項,例如可選擇是否允許更改capture到的外部變數 ret表示函式返回型別,一般可以免了,因為我們在f前面...

lambda 函式或者匿名函式(C 11)

lambda 函式也就是沒有名字的函式,一般情況下,在任何地方,如果需要把乙個函式作為引數給出,但你寧願給出乙個簡短即時函式定義,而不是乙個指向原始檔其他地方或者另乙個模組中提供的定義的指標時,lambda 函式可能是有用的,lambda 函式可以作為 動態 給出的乙個快捷方便的函式,而不是正式定義...