c++ lambda函数_C++11 之 lambda函数的详细使用
1. lambda 函數(shù)概述
lambda 表達(dá)式是一種匿名函數(shù),即沒(méi)有函數(shù)名的函數(shù);該匿名函數(shù)是由數(shù)學(xué)中的λ演算而來(lái)的。通常情況下,lambda函數(shù)的語(yǔ)法定義為:
[capture] (parameters) mutable ->return-type {statement}
其中:
[capture] :捕捉列表。捕捉列表總是作為lambda的開(kāi)始,即出現(xiàn)于lambda的開(kāi)始處。它是lambda的引出符(即開(kāi)始標(biāo)志)。編譯器可以根據(jù)該“標(biāo)志”來(lái)作出判斷出該函數(shù)是否為lambda函數(shù)。同時(shí)“捕捉列表”能夠捕捉上下文中的變量以作為lambda函數(shù)使用。
(parameters):參數(shù)列表。和C/C++中的普通函數(shù)參數(shù)意義一樣。該部分是可選的,意味著如果我們不需要進(jìn)行參數(shù)傳遞時(shí),可以連同括號(hào)“()”一起省略掉。
mutable:該關(guān)鍵字為一個(gè)修飾符。在默認(rèn)的情況下,lambda函數(shù)總是返回一個(gè)const,而當(dāng)我們?cè)趨?shù)列表后面注明了“mutable”關(guān)鍵字之后,則可以取消其常量性質(zhì)。若在lambda中使用了mutable修飾符,則“參數(shù)列表”是不可省略掉的(即使是參數(shù)為空)。
->return-type: 函數(shù)的返回值類(lèi)型。和C/C++中的普通函數(shù)返回值類(lèi)型的性質(zhì)一樣。主要目的是用來(lái)追蹤lambda函數(shù)(有返回值情況下)的返回類(lèi)型。若lambda函數(shù)不需要返回值,則可以直接將這部分省略掉。
{statement}:函數(shù)體。在該函數(shù)體中,除了可以使用參數(shù)列表中的變量外,還可以使用所有捕獲到的變量(即[capture] 中的變量)。
見(jiàn)下圖:
1.1. lambda 函數(shù)中“捕捉列表”詳解
C++11中的lambda函數(shù),其中的“捕捉列表”是由0個(gè)或多個(gè)“捕捉項(xiàng)”組成,并以逗號(hào)“,”分隔。捕捉列表有如下幾種形式:
(1)[var] 表示值傳遞方式捕捉變量var。
上面的代碼中,“捕捉列表”由3項(xiàng)組成。以引用傳遞的方式捕捉變量a、b,以值傳遞的方式捕捉變量c。因此在lambda表達(dá)式的函數(shù)體中修改了變量a和b之后,父作用域中的a、b值也改變。而即使是在lambda函數(shù)內(nèi)部修改了變量c的值,父作用域中的c仍然不會(huì)受到影響,因?yàn)槭侵祩鬟f的方式。(需在參數(shù)列表后面加上 mutable 關(guān)鍵字(修飾符))。同時(shí)
#include <iostream> #include <string> #include <stdio.h> using namespace std; int main() {int a = 1,b =2, c =3;auto retVal = [=,&a,&b]() mutable->int{printf("inner c[%d]n",c);a = 10;b = 20;c = 30;printf("inner c2[%d]n",c);return a+b;};printf("sum[%d]n",retVal());printf("a[%d] b[%d] c[%d]n",a,b,c);return 0; }打印結(jié)果: inner c[3] inner c2[30] sum[30] a[10] b[20] c[3](2)[=] 表示值傳遞方式捕捉所有父作用域的變量(包括this)。
(3)[&var] 表示引用傳遞捕捉變量var。
(4)[&] 表示引用傳遞捕捉所有父作用域的比哪里(2020-02-18 09:36:12 修改) 的變量(包括this)。
(5)[this] 表示值傳遞方式捕捉當(dāng)前的this指針。
同理(2),(3),(5)可以參考上面的兩個(gè)例子。
2. lambda 函數(shù)特點(diǎn)
(1)在C++11中,lambda函數(shù)是inline(內(nèi)聯(lián)函數(shù))。
3. lambda 函數(shù)使用
代碼一
#include <iostream> #include <string> #include <stdio.h> using namespace std; int main() {int a = 6;int b = 8;auto sum = [](int a,int b) ->int{return a + b;};printf("sum[%d]n",sum(a,b));return 0; }//打印結(jié)果:sum[14]在代碼一中,定義了一個(gè)簡(jiǎn)單的lambda函數(shù),該函數(shù)的函數(shù)列表能夠接收兩個(gè)int類(lèi)型的數(shù)據(jù),而且返回值為int類(lèi)型。
注意:lambda函數(shù)中,參數(shù)列表和返回類(lèi)型都是可選的部分,而且捕捉列表和函數(shù)也可以為空。因此,在某種情況下,C++11中的簡(jiǎn)略版本的lambda函數(shù)可以是這樣的:
// 完整語(yǔ)法 [ capture-list ] ( params ) mutable(optional) constexpr(optional)(c++17) exception attribute -> ret { body } // 可選的簡(jiǎn)化語(yǔ)法 [ capture-list ] ( params ) -> ret { body } [ capture-list ] ( params ) { body }最為簡(jiǎn)潔的版本如下, 多謝讀者「-兮」 的指正。已將[]()修改為了[]{}
[ capture-list ] { body }代碼二
在C++開(kāi)發(fā)中,
4. lambda 函數(shù)與 STL
更多技術(shù)干貨見(jiàn)個(gè)人微信公眾號(hào): 雅俗不共賞 掃碼關(guān)注不迷路~
http://weixin.qq.com/r/NhIjOz-EnWLirXtY90ck (二維碼自動(dòng)識(shí)別)
總結(jié)
以上是生活随笔為你收集整理的c++ lambda函数_C++11 之 lambda函数的详细使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: html在线取色,JS实现的RGB网页颜
- 下一篇: leetcode 242 有效的字母异位