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 = 10namespace;
int y = 3
;
intz ;
z = [=]()mutable throw() -> int ();
cout
cout
<
<
執行結果為:
x: 10 y: 3
因為是以值傳遞的方式訪問x,y所以x,y的值並沒有發生改變
現在我們對lambda表示式的基本語法已經有一些了解,下面來舉幾個例子。
首先這個例子說明如何向lambda表示式裡面傳遞引數:
#include using
std;
intmain()
(5, 4
); cout
<< n
執行結果為:9
通過這個例子我們可以看出,通過「函式體」後面的『()』傳入引數。
接下來這個例子可以看出,可以像呼叫函式一樣使用lambda表示式,但是感覺這種方式和普通函式的定義與呼叫就差不多了,這裡只是學習使用方式而已。
#include using執行結果為:33namespace
std;
intmain()
; cout
<< f(21, 12) <
}
lambda表示式與stl演算法一起使用,自己寫測試**的時候經常用到排序、輸出陣列什麼的,通過下面列舉的幾個演算法也比較方便:
#include #include假設你設計了乙個位址簿的類。現在你要提供函式查詢這個位址簿,可能根據姓名查詢,可能根據位址查詢,還有可能兩者結合。要是你為這些情況都寫個函式,那麼你一定就跪了。所以你應該提供乙個介面,能方便地讓使用者自定義自己的查詢方式。在這裡可以使用lambda函式來實現這個功能。#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;
下面是各種變數擷取的選項:
[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...