C++11 Lambda表達式(匿名函數)

C++11引入了lambda表達式,使得程序員能夠定義匿名函數,該函數是一次性執行的,既方便了編程,又能防止別人的訪問。ios

Lambda表達式的語法經過下圖來介紹:程序員

 

         這裏假設咱們定義了一個如上圖的lambda表達式。如今來介紹途中標有編號的各個部分是什麼意思。算法

  1. Lambda表達式的引入標誌,在‘[]’裏面能夠填入‘=’或‘&’表示該lambda表達式「捕獲」(lambda表達式在必定的scope能夠訪問的數據)的數據時以什麼方式捕獲的,‘&’表示一引用的方式;‘=’代表以值傳遞的方式捕獲,除非專門指出。
  2. Lambda表達式的參數列表
  3. Mutable 標識
  4. 異常標識
  5. 返回值
  6. 「函數」體,也就是lambda表達式須要進行的實際操做
語法 序號
[ 捕獲列表 ] ( 形參數列表 ) mutable(可選) 異常屬性 -> 返回值類型 { 函數體 } (1)
[ capture-list ] ( params ) -> ret { body } (2)
[ capture-list ] ( params ) { body } (3)
[ capture-list ] { body } (4)
  • (1)爲完整的形式,包含變量捕獲列表、形參列表、可變屬性(可選)和返回值類型等。
  • (2)省略了mutable,表示Lambda不能修改捕獲的變量。
  • (3)Lambda的返回值類型若是能夠由函數體中的實際返回值推導出,能夠省略。
  • (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;
}
相關文章
相關標籤/搜索