C 11 Lambda表示式(匿名函式)

2021-08-14 12:35:09 字數 2756 閱讀 4561

c++11引入了lambda表示式,使得程式設計師可以定義匿名函式,該函式是一次性執行的,既方便了程式設計,又能防止別人的訪問。

lambda表示式的語法通過下圖來介紹:

這裡假設我們定義了乙個如上圖的lambda表示式。現在來介紹途中標有編號的各個部分是什麼意思。

lambda表示式的引入標誌,在『』裡面可以填入『=』或『&』表示該lambda表示式「捕獲」(lambda表示式在一定的scope可以訪問的資料)的資料時以什麼方式捕獲的,『&』表示一引用的方式;『=』表明以值傳遞的方式捕獲,除非專門指出。

lambda表示式的引數列表

mutable 標識

異常標識

返回值「函式」體,也就是lambda表示式需要進行的實際操作 語法

序號[ 捕獲列表 ] ( 形引數列表 ) mutable(可選) 異常屬性 -> 返回值型別(1)

[ capture-list ] ( params ) -> ret(2)

[ capture-list ] ( params )(3)

[ capture-list ](4)

將上圖的**片段補充完整:

int x = 10

;

int y = 3

;

intz ;

z = [=]()mutable throw() -> int ();

cout

cout

<

<

執行結果為:

x: 10  y: 3

因為是以值傳遞的方式訪問x,y所以x,y的值並沒有發生改變

現在我們對lambda表示式的基本語法已經有一些了解,下面來舉幾個例子。

首先這個例子說明如何向lambda表示式裡面傳遞引數:

#include using

namespace

std;

intmain()

(5, 4

); cout

<< n

執行結果為:9

通過這個例子我們可以看出,通過「函式體」後面的『()』傳入引數。

接下來這個例子可以看出,可以像呼叫函式一樣使用lambda表示式,但是感覺這種方式和普通函式的定義與呼叫就差不多了,這裡只是學習使用方式而已。

#include using

namespace

std;

intmain()

; cout

<< f(21, 12) <

}

執行結果為:33

lambda表示式與stl演算法一起使用,自己寫測試**的時候經常用到排序、輸出陣列什麼的,通過下面列舉的幾個演算法也比較方便:

#include #include 

#include

using

namespace

std;

intmain()

; srand(time(null));

generate(a,a+10,()->int );

cout

<

before sort:

"<

for_each(a, a+10, [&](int i));

cout

<

cout

<

after sort

"<

sort(a,a+10

); for_each(a, a+10, [&](int i));

return0;

下面是各種變數擷取的選項:

假設你設計了乙個位址簿的類。現在你要提供函式查詢這個位址簿,可能根據姓名查詢,可能根據位址查詢,還有可能兩者結合。要是你為這些情況都寫個函式,那麼你一定就跪了。所以你應該提供乙個介面,能方便地讓使用者自定義自己的查詢方式。在這裡可以使用lambda函式來實現這個功能。

[cpp]view plain

copy

#include 

#include 

class addressbook  

}  return results;  

}  private:  

std::vector_addresses;  

};  

從上面**可以看到,findmatchingaddressses函式提供的引數是func型別,這是乙個泛型型別。在使用過程中應該傳入乙個函式,然後分別對位址簿中每乙個entry執行這個函式,如果返回值為真那麼表明這個entry符合使用者的篩選要求,那麼就應該放入結果當中。那麼這個func型別的引數如何傳入呢?

[cpp]view plain

copy

addressbook global_address_book;  

vectorfindaddressesfromorgs ()  

);  

}  

可以看到,我們在呼叫函式的時候直接定義了乙個lambda函式。引數型別是

[cpp]view plain

copy

const string& addr  

返回值是bool型別。

如果使用者要使用不同的方式查詢的話,只要定義不同的lambda函式就可以了。

C 11 Lambda表示式(匿名函式)詳解

使用 stl 時,往往會大量用到函式物件,為此要編寫很多函式物件類。有的函式物件類只用來定義了乙個物件,而且這個物件也只使用了一次,編寫這樣的函式物件類就有點浪費。而且,定義函式物件類的地方和使用函式物件的地方可能相隔較遠,看到函式物件,想要檢視其 operator 成員函式到底是做什麼的也會比較麻...

C 11 lambda表示式 詳解

如下圖,lambda表示式由下面幾個部分構成 c 11 的 lambda 表示式規範如下 mutable 修飾符說明 lambda 表示式體內的 可以修改 獲的變數,並且可以訪問 獲物件的 non const 方法。exception 說明 lambda 表示式是否丟擲異常 noexcept 以及丟...

C 11 lambda 表示式解析

中括號中 from 下面是各種變數擷取的選項 小括號中,就是函式引數 lambda表示式可以作為其它函式引數 1 標準格式 有箭頭 就要顯示寫明返回值型別 auto pfunc1 this void pfunc1 2 簡化格式 void 型別返回值 沒有箭頭 會預設檢測返回值型別 auto pfun...