C++11引入了lambda表達式,使得程序員能夠定義匿名函數,該函數是一次性執行的,既方便了編程,又能防止別人的訪問。ios
Lambda表達式的語法經過下圖來介紹:程序員
這裏假設咱們定義了一個如上圖的lambda表達式。如今來介紹途中標有編號的各個部分是什麼意思。算法
語法 | 序號 |
---|---|
[ 捕獲列表 ] ( 形參數列表 ) mutable(可選) 異常屬性 -> 返回值類型 { 函數體 } |
(1) |
[ capture-list ] ( params ) -> ret { body } |
(2) |
[ capture-list ] ( params ) { body } |
(3) |
[ capture-list ] { body } |
(4) |
將上圖的代碼片斷補充完整:編程
int x = 10; int y = 3; int z ; z = [=]()mutable throw() -> int { int n = x + y; x = y ; y = n; return n;}(); cout<<z<<endl; cout<<"x:"<<x<<"\t"<<"y:"<<y<<endl;
運行結果爲:數組
13函數
x: 10 y: 3學習
由於是以值傳遞的方式訪問x,y因此x,y的值並無發生改變測試
如今咱們對lambda表達式的基本語法已經有一些瞭解,下面來舉幾個例子。spa
首先這個例子說明如何向lambda表達式裏面傳遞參數:code
#include <iostream> using namespace std; int main() { int n = [] (int x, int y) { return x + y; }(5, 4); cout << n << endl; }
運行結果爲:9
經過這個例子咱們能夠看出,經過「函數體」後面的‘()’傳入參數。
接下來這個例子能夠看出,能夠像調用函數同樣使用lambda表達式,可是感受這種方式和普通函數的定義與調用就差很少了,這裏只是學習使用方式而已。
#include <iostream> using namespace std; int main() { auto f = [] (int x, int y) { return x + y; }; cout << f(21, 12) << endl; }
運行結果爲:33
Lambda表達式與STL算法一塊兒使用,本身寫測試代碼的時候常常用到排序、輸出數組什麼的,經過下面列舉的幾個算法也比較方便:
#include <iostream> #include <algorithm> #include <ctime> using namespace std; int main() { int a[10] = {0}; srand(time(NULL)); generate(a,a+10,[]()->int { return rand() % 100; }); cout<<"before sort: "<<endl; for_each(a, a+10, [&](int i){ cout<< i <<" "; }); cout<<endl; cout<<"After sort"<<endl; sort(a,a+10); for_each(a, a+10, [&](int i){ cout<< i <<" "; }); return 0; }