亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

淺析C++11新特性的Lambda表達式

2020-05-23 14:01:23
字體:
來源:轉載
供稿:網友

lambda簡介

熟悉Python的程序員應該對lambda不陌生。簡單來說,lambda就是一個匿名的可調用代碼塊。在C++11新標準中,lambda具有如下格式:

[capture list] (parameter list) -> return type { function body }

可以看到,他有四個組成部分:

    1.capture list: 捕獲列表

    2.parameter list: 參數列表

    3.return type: 返回類型

    4.function body: 執行代碼

其中,參數列表和返回類型可以忽略。

下面,具體看幾個簡單的例子:

auto f1 = [] { return 1; };auto f2 = [] () { return 2; };cout<<f1()<<'/t'<<f2()<<endl;

捕獲列表

lambda中的捕獲列表既可以捕獲值,也可以捕獲引用。

捕獲值:

int test_data[] = {1, 5, 9, 7, 3, 19, 13, 17};int border = 8;auto f3 = [border](const int &i){ if(i > border) cout<<i<<'/t'; };for_each(begin(test_data), end(test_data), f3);cout<<endl;

捕獲引用:

auto f4 = [&border](const int &i){ if(i > border) cout<<i<<'/t'; };border = 6;for_each(begin(test_data), end(test_data), f4);cout<<endl;

通過輸出可以看出,lambda中起作用的border是修改后的6,證實了捕獲的確是是引用。

需要注意的是,在捕獲引用時,需要保證當lambda被調用時,此引用仍然有效。

捕獲列表還可以采用隱式捕獲的方式,即讓編譯器通過lambda的執行代碼來判斷需要捕獲哪些局部變量。

隱式捕獲可以捕獲值、引用或者兩者混合:

char space = ' ';auto f5 = [=](const int &i){ if(i > border) cout<<i<<'/t'; };auto f6 = [&](const int &i){ if(i > border) cout<<i<<'/t'; };auto f7 = [&, space](const int &i){ if(i > border) cout<<i<<space; };border = 0;for_each(begin(test_data), end(test_data), f5);cout<<endl;for_each(begin(test_data), end(test_data), f6);cout<<endl;for_each(begin(test_data), end(test_data), f7);cout<<endl;

這里的f7使用的混合形式,可以讀作“除了space捕獲值之外,其他變量均捕獲引用”。

可變lambda

lambda需要在其中修改被值捕獲的變量的值時,需要給lambda加上mutable關鍵字。否則會有編譯錯誤。

auto f8 = [&, space](const int &i) mutable { if(i > border) {cout<<i<<space; space='/t';} };for_each(begin(test_data), end(test_data), f8);cout<<endl;cout<<1<<space<<2<<endl;

從輸出中可以看出,spacelambda f8中的值,在第一次調用之后,就被變成了制表符Tab;但是在lambda之外,space仍然是空格。

返回類型

lambda的返回類型采用尾置返回類型的方式。一般的:

    1.lambda如果只包含return語句,則編譯器可以推斷其返回類型,此時可以不顯示指定返回類型;

    2.否則,編譯器假定lambda返回void,而返回void的函數不可以反悔任何具體值,這在大多數情況下是個矛盾,因此需要顯示指定返回類型。

但是,經過實際測試,目前的g++編譯器更聰明了:對于第2點,目前只要編譯器可以從lambda函數體中推斷出函數的返回類型,就不需要顯式指定返回類型,例如:

auto f9 = [](const int i){if(i % 3) return i * 3; else return i;};transform(begin(test_data), end(test_data), begin(test_data), f9);border = 0;for_each(begin(test_data), end(test_data), f6);cout<<endl;

lambda代碼塊中有多個return語句,并且還有if/else語句,但是編譯器可以根據return語句推斷出,其返回值應該是一個int類型,所以可以省略尾置返回類型。

但是,像下面這種形式,由于編譯器在推斷返回類型時發現了不一致,所以必須顯式的指定返回類型:

auto f10 = [](const int i) -> double{if(i % 5) return i * 5.0; else return i;};transform(begin(test_data), end(test_data), begin(test_data), f10);for_each(begin(test_data), end(test_data), f6);cout<<endl;

總結

    1.lambda表達式形式: [capture list] (parameter list) -> return type { function body },其中parameter list和return type可以省略。

    2.捕獲列表可以捕獲值[val],也可以捕獲引用[&ref]。

    3.捕獲列表還可以隱式捕獲局部變量,同樣有捕獲值[=]和捕獲引用[&]兩種方式,初次之外還可以混合捕獲[&, val]或者[=, &ref]。

    4.當lambda需要修改捕獲的值時,需要加上mutable關鍵字。

    4.當lambda無法自動推斷出返回值類型時,需要通過尾置返回類型的方式顯示指定。

以上就是C++11新特性之Lambda表達式的全部內容,希望本文對大家學習C++有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品电影免费在线观看| 在线性视频日韩欧美| 亚洲女人天堂av| 最近2019年中文视频免费在线观看| 亚洲第一福利视频| 日韩精品中文字幕有码专区| 中文字幕日韩在线观看| 精品视频—区二区三区免费| 欧洲美女7788成人免费视频| 亚洲精品之草原avav久久| 欧美贵妇videos办公室| 亚洲综合成人婷婷小说| 亚洲国产古装精品网站| 91夜夜未满十八勿入爽爽影院| 97精品欧美一区二区三区| 在线精品国产成人综合| 国产精品中文字幕久久久| 亚洲成人黄色网址| 欧美中文在线观看国产| 欧美日韩国产成人高清视频| 日本午夜在线亚洲.国产| 成人国产精品久久久| 黄色精品一区二区| 成人在线视频网| 综合国产在线视频| 一级做a爰片久久毛片美女图片| 欧美中文在线观看国产| 国产婷婷97碰碰久久人人蜜臀| 精品亚洲aⅴ在线观看| 亚洲欧洲成视频免费观看| 高清在线视频日韩欧美| 国产有码在线一区二区视频| 亚洲精品之草原avav久久| 伦理中文字幕亚洲| 国产精品久久av| 欧美成人激情图片网| 奇米一区二区三区四区久久| 亚洲精品乱码久久久久久按摩观| 欧美中文字幕视频在线观看| 另类专区欧美制服同性| 一本色道久久88亚洲综合88| 欧美多人爱爱视频网站| 欧美一级片久久久久久久| 国产精品第七十二页| 伊人av综合网| 在线电影中文日韩| 日韩精品视频免费在线观看| 国产色婷婷国产综合在线理论片a| 亚洲精品99999| 国产精品美女呻吟| 国产精品天天狠天天看| 国产成人在线播放| 日韩av手机在线看| 一区二区三区四区精品| 国产激情视频一区| 欧美性69xxxx肥| 国产视频综合在线| 午夜精品一区二区三区在线视频| 久久夜色精品国产欧美乱| 国内精品久久久久久久久| 黑人巨大精品欧美一区二区三区| 国产精品久久久久久久久粉嫩av| 国产日本欧美一区二区三区在线| 亚洲jizzjizz日本少妇| 欧美色另类天堂2015| 成人深夜直播免费观看| 日韩久久午夜影院| 亚洲色图欧美制服丝袜另类第一页| 欧美老女人xx| 欧美精品激情视频| 色综合久久中文字幕综合网小说| 国产a∨精品一区二区三区不卡| 亚洲色无码播放| 色琪琪综合男人的天堂aⅴ视频| 韩国国内大量揄拍精品视频| 国产精品久久色| 日韩中文有码在线视频| 亚洲精品电影在线| 欧美俄罗斯乱妇| 91久久国产综合久久91精品网站| 日韩免费观看av| 亚洲人成电影网| 91免费在线视频网站| 日韩在线免费视频观看| 日韩电影中文字幕| 亚洲午夜色婷婷在线| 欧美高清videos高潮hd| 91在线高清视频| 日韩电影中文字幕在线观看| 丝袜亚洲欧美日韩综合| 高跟丝袜欧美一区| 久久久精品一区二区| 国产免费一区视频观看免费| 亚洲精品成人久久久| 国内外成人免费激情在线视频| 国产精品视频免费观看www| 亚洲欧美一区二区三区四区| 日韩中文在线观看| 精品香蕉在线观看视频一| 国产精品第2页| 精品国产1区2区| 亚洲乱码一区二区| 精品亚洲一区二区三区在线观看| 91精品视频在线播放| 亚洲第一网中文字幕| 国产精品视频一区二区高潮| 国产成人精品免费视频| 91欧美精品成人综合在线观看| 亚洲成人aaa| 欧美激情精品久久久久| 亚洲在线一区二区| 国外视频精品毛片| 亚洲欧洲国产精品| 亚洲偷欧美偷国内偷| 久久电影一区二区| 91高潮在线观看| 91国偷自产一区二区三区的观看方式| 国产精品91久久| 欧美国产视频日韩| 亚洲欧美一区二区三区久久| 中文精品99久久国产香蕉| 欧美视频一区二区三区…| 久久影视免费观看| 日本a级片电影一区二区| 国产一区二区三区在线播放免费观看| 久久久国产91| 国产精品18久久久久久麻辣| 中文字幕亚洲图片| 亚洲欧洲成视频免费观看| 日韩精品中文字幕视频在线| 欧美黑人巨大精品一区二区| 成人在线中文字幕| 国产免费一区二区三区在线能观看| 久久精品国产电影| 久久成人国产精品| 1769国内精品视频在线播放| 91成人福利在线| 国产精品国产福利国产秒拍| 国产99在线|中文| 久久久成人精品视频| 中文字幕日韩欧美| 中日韩午夜理伦电影免费| 97久久国产精品| 久久久久久久影视| 久久91亚洲精品中文字幕奶水| 国产精品日韩欧美大师| 97avcom| 欧美激情中文字幕乱码免费| 国产在线日韩在线| 日韩**中文字幕毛片| 国产日韩欧美视频在线| 亚洲欧美中文字幕在线一区| 青青a在线精品免费观看| 精品国产自在精品国产浪潮| 久久久久久91香蕉国产| 亚洲永久免费观看| 久久福利视频导航| 色综合五月天导航| 国产精品盗摄久久久| 国产v综合v亚洲欧美久久| 亚洲欧美激情一区| 日韩成人xxxx| 国产精品久久综合av爱欲tv| 国产精品jizz在线观看麻豆|