c++11 lambda
生活随笔
收集整理的這篇文章主要介紹了
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)使用了&或者=就默認添加此選項。
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python dataframe 查看为
- 下一篇: 斐波那契数列c++代码_轮到你了,斐波那