1. 程式人生 > 其它 >C++11之lambda表示式

C++11之lambda表示式

  • 什麼是lambda表示式? 答:來我們看看百度怎麼說?Lambda 表示式(lambda expression)是一個匿名函式,Lambda表示式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函式,即沒有函式名的函式。Lambda表示式可以表示團包(注意和數學傳統意義上的不同)。lambda是C++11中的一大亮點,但是他也不是隻有C++中有啊,比他更早的Python等高階語言中都有lambda表示式。該表示式的特點就是簡潔,他可以在函式中去定義另外一個匿名函式,並且還可以直接把他給呼叫起來。這就很方便了。使得程式非常的簡潔高效靈活。 ​
  • lambda表示式的語法 [capture list](parans list) opt-> return {body;}; capture:捕獲列表 parans:引數列表 opt:函式選項,該部分我們可以省略掉 return:返回值型別,也可省略 body:函式體
  • 我們需要把它寫道函式的內部才行,基於該函式原型,寫例項demo如下:
    該函式是放在一個建構函式的內部定義並執行的,我們先不管建構函式,抓重點:函式內部; 這個函式中我們省略了捕獲物件,引數列表,函式返回值; 由於這個匿名函式沒有名字,所以函式的呼叫也就只需要將匿名函式的申明再寫一遍即可; 函式的定義部分的結尾有一對括號,該括號的作用是裡邊寫引數列表的,但是由於我們沒有引數,所以空放在這即可。
  • 捕獲外部變數 捕獲外部變數就是在建構函式的內部,匿名函式的外部完成的;就是捕獲到匿名函式外面的區域性變數並在匿名函式的內部用它。 要想使用捕獲的方法就必須要知道捕獲列表,下面就是捕獲列表:
  [] ----------------》沒有定義任何變數。使用未定義變數會引發錯誤,也就是不能使用任何匿名函式體外部的變數,否則會出錯; 如果要使用外部變數,而且是不加任何限制的使用,怎麼辦?有兩種方式:   [&]--------------》 任何被使用到的外部變數都隱式地以引用方式加以引用(按引用捕獲);   ​[=]--------------》任何被使用到的外部變數都隱式地以傳值方式加以引用(按值捕獲); 作為副本在函式體內進行使用,拷貝的副本在匿名函式體內部是隻讀的;
  ​[x, &y]----------》 x以傳值方式傳入(預設),y以引用方式傳入; 只有y是以引用的方式傳遞進來的,除此之外的其他變數是以值拷貝的方式傳入的; ​   [&]--------------》 任何被使用到的外部變數都隱式地以引用方式加以引用。   ​[=]--------------》任何被使用到的外部變數都隱式地以傳值方式加以引用。   ​[&, x]------ ----》 x顯式地以傳值方式加以引用。其餘變數以引用方式加以引用。   ​[=, &z]---- ----》z顯式地以引用方式加以引用。其餘變數以傳值方式加以引用。 ​
  • 以下所有的程式碼都是在匿名函式的外部定義三個變數
  • 以引用的方式捕獲外部資料:
  • 以值拷貝的方式捕獲外部資料:
    我們直接把&換成=的話,這樣是會報錯的,因為我們的值拷貝進來的資料是隻讀,我們,因此,我們需要使用mutable關鍵字修飾,把這個關鍵字放在opt這個位置。 ​這裡opt處的關鍵字除了mutable之外還有其他,比如丟擲異常之類的,有用到了可以再查,一般mutable就夠了。
  • 帶形參列表的以值拷貝的方式捕獲外部資料:
    匿名函式:[capture list](parans list) opt-> return {body;}; ​params list是形參表;
  • 匿名函式的返回值: 匿名函式:[capture list](parans list) opt-> return {body;}; -> return:表示返回值,預設“return"這個地方是不需要我們指定返回值型別的,因為編譯器會自動幫我們推到出來返回值得型別,有一種情況是我們需要去指定返回值的型別的,那就是匿名函式內部使用多次的return後需要指定返回值的型別。 ​