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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

c++11 lambda

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

C++11 的 lambda 表達式規(guī)范如下:

[?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 表達式的返回類型可以按照下列規(guī)則推演出來:
    • 如果 lambda 代碼塊中包含了 return 語句,則該 lambda 表達式的返回類型由 return 語句的返回類型確定。
    • 如果沒有 return 語句,則類似 void f(...) 函數(shù)。
  • 省略了參數(shù)列表,類似于無參函數(shù) f()。

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

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

attribute?用來聲明屬性。

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

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

此外,params?指定 lambda 表達式的參數(shù)。

轉(zhuǎn)載于:https://www.cnblogs.com/diegodu/p/6142245.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。