日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++11 lambda

發布時間:2023/12/10 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++11 lambda 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為什么需要lambda函數 匿名函數是許多編程語言都支持的概念,有函數體,沒有函數名。1958年,lisp首先采用匿名函數,匿名函數最常用的是作為回調函數的值。正因為有這樣的需求,c++引入了lambda 函數,你可以在你的源碼中內聯一個lambda函數,這就使得創建快速的,一次性的函數變得簡單了。例如,你可以把lambda函數可在參數中傳遞給std::sort函數 #include <algorithm> #include <cmath> void abssort(float* x, unsigned N) { std::sort(x, x + N, // Lambda expression begins [](float a, float b) { return std::abs(a) < std::abs(b); }); } 你可能會問,使用函數對象不是也可以嗎?是的,函數對象當然沒問題,自己寫的回調函數,你可以傳個函數指針也沒有問題。他們有優點也有缺點。函數對象能維護狀態,但語法開銷大,而函數指針語法開銷小,卻沒法保存范圍內的狀態。如果你覺得魚和熊掌不可兼得,那你可錯了。lambda函數結合了兩者的優點,讓你寫出優雅簡潔的代碼。 基本lambda語法 基本形式如下: [capture](parameters)->return-type {body} []叫做捕獲說明符,表示一個lambda表達式的開始。接下來是參數列表,即這個匿名的lambda函數的參數,->return-type表示返回類型,如果沒有返回類型,則可以省略這部分。想知道為什么返回類型可以這么表示,這涉及到c++11的另一特性,參見自動類型推導,最后就是函數體部分了。 我們可以這樣輸出"hello,world" auto func = [] () { cout << "hello,world";?}; func(); //?now?call?the?function 變量捕獲與lambda閉包實現 string name; cin >> name; [&](){cout << name;}(); lambda函數能夠捕獲lambda函數外的具有自動存儲時期的變量。函數體與這些變量的集合合起來叫閉包。
  • [] 不截取任何變量
  • [&} 截取外部作用域中所有變量,并作為引用在函數體中使用
  • [=] 截取外部作用域中所有變量,并拷貝一份在函數體中使用
  • [=, &foo] 截取外部作用域中所有變量,并拷貝一份在函數體中使用,但是對foo變量使用引用
  • [bar] 截取bar變量并且拷貝一份在函數體重使用,同時不截取其他變量
  • [x, &y] x按值傳遞,y按引用傳遞
  • [this] 截取當前類中的this指針。如果已經使用了&或者=就默認添加此選項。
看到這,不禁要問,這魔法般的變量捕獲是怎么實現的呢?原來,lambda是通過創建個小類來實現的。這個類重載了操作符(),一個lambda函數是該類的一個實例。當該類被構造時,周圍的變量就傳遞給構造函數并以成員變量保存起來。看起來跟函數對象很相似。 最后,lambda函數的類型是什么呢,答案是std:function。

C++11 的 lambda 表達式規范如下:

[?capture?]?(?params?)?mutable?exception?attribute?->?ret?{?body?}(1)?
[?capture?]?(?params?)?->?ret?{?body?}(2)?
[?capture?]?(?params?)?{?body?}(3)?
[?capture?]?{?body?}(4)?

其中

  • (1) 是完整的 lambda 表達式形式,
  • (2) const 類型的 lambda 表達式,該類型的表達式不能改捕獲("capture")列表中的值。
  • (3)省略了返回值類型的 lambda 表達式,但是該 lambda 表達式的返回類型可以按照下列規則推演出來:
    • 如果 lambda 代碼塊中包含了 return 語句,則該 lambda 表達式的返回類型由 return 語句的返回類型確定。
    • 如果沒有 return 語句,則類似 void f(...) 函數。
  • 省略了參數列表,類似于無參函數 f()。

mutable?修飾符說明 lambda 表達式體內的代碼可以修改被捕獲的變量,并且可以訪問被捕獲對象的 non-const 方法。

exception?說明 lambda 表達式是否拋出異常(noexcept),以及拋出何種異常,類似于void?f()?throw(X, Y)。

attribute?用來聲明屬性。

另外,capture?指定了在可見域范圍內 lambda 表達式的代碼內可見得外部變量的列表,具體解釋如下:

  • [a,&b]?a變量以值的方式唄捕獲,b以引用的方式被捕獲。
  • [this]?以值的方式捕獲 this 指針。
  • [&]?以引用的方式捕獲所有的外部自動變量。
  • [=]?以值的方式捕獲所有的外部自動變量。
  • []?不捕獲外部的任何變量。

此外,params?指定 lambda 表達式的參數。

轉載于:https://www.cnblogs.com/diegodu/p/6142245.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的c++11 lambda的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。