色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么引入Lambda?C++11 Lambda表達式介紹

冬至子 ? 來源:iDoitnow ? 作者:艱默 ? 2023-07-18 16:26 ? 次閱讀

為什么引入Lambda

Lambda表達式是一個可以內聯在我們代碼中的函數,我們可以將他傳遞給另外一個函數。在沒有引入Lambda表達式之前,當我們遇到需要對多個數據,按照同一規(guī)則進行操作的時候,創(chuàng)建機動函數會更簡單,但是必須在其他地方定義好該函數,然后再使用它,有時候兩者之間可能距離離的很遠,想要了解該函數內部操作的原理,需要翻閱多頁源代碼找它的定義,這樣使得代碼的可讀性大打折扣。這就是Lambda表達式出現的主要原因。

基本的Lambda語法

lambda表達式是一個匿名函數。其可以捕獲作用域中的變量。其在C++11中常用的語法如下:

[captures](params){body}
[captures]{body}  //省略了形參列表,函數不接收實參,如同形參列表為()
[captures](params)- >return-type{body}  //return-type為返回類型


//eg:
//捕獲列表     參數列表           函數體
    []   (int a, int b)  { return a < b;}
//捕獲列表     參數列表      返回類型          函數體
    []   (double x)  - > double   {int y = x; return x - y;}
/*注:Lambda函數沒有聲明返回類型,其返回類型相當于使用decltyp根據返回值推斷得到的。
     如果函數體內不包含返回語句,則推斷出返回類型為void。
     但是僅當函數體完全由一條返回語句組成時,自動類型推斷才管用
     否則,需要使用新增的返回類型后置語法*/

:Lambda表達式自動推斷返回值類型:有些編譯器,像GCC,即使你有多于一個返回語句也不可以自動推斷成功,但標準不保證這一點,因此為了防止意外的發(fā)生,當函數體內返回語句不止一條的時候,建議使用返回類型后置語法】

其中captures為捕獲,它一個包含0個或者多個捕獲符的用逗號分隔的列表。params為參數列表,body為函數體。默認的捕獲符只有:

  • &:采用引用隱式捕獲的方式使用自動變量
  • =:采用復制隱式捕獲的方式使用自動變量
    []        // 默認不捕獲
    [&]       // 默認以引用捕獲(意味著在函數體內可以按照引用的方式使用Lambda表達式所在范圍內所有可見的局部變量)
    [&, i]    // 以引用捕獲(同上),但i以值捕獲
    [=]       // 默認以復制捕獲(意味著在函數體內可以按照值傳遞的方式使用Lambda表達式所在范圍內所有可見的局部變量)
    [=, &i]   // 以復制捕獲(同上),但 i 以引用捕獲
    

下面我們通過C++ Primer Plus中的一個例子進一步理解Lambda表達式:

#include < iostream >
#include < vector >
#include < algorithm >
#include < cmath >
#include < ctime >
const long Size = 390000L;
int main()
{
  using std::cout;
  std::vector< int > numbers(Size);
  std::srand(std::time(0));
  std::generate(numbers.begin(), numbers.end(), std::rand);
  cout < < "Sample size = " < < Size < < 'n';
  // using lambdas
  int count3 = std::count_if(numbers.begin(), numbers.end(),
                             [](int x){return x % 3 == 0;});
  cout < < "Count of numbers divisible by 3: " < < count3 < < 'n';
  int count13 = 0;
  std::for_each(numbers.begin(), numbers.end(),
                [&count13](int x){count13 += x % 13 == 0;});
  cout < < "Count of numbers divisible by 13: " < < count13 < < 'n';
  // using a single lambda
  count3 = count13 = 0;
  std::for_each(numbers.begin(), numbers.end(),
                [&](int x){count3 += x % 3 == 0; count13 += x % 13 == 0;});
  cout < < "Count of numbers divisible by 3: " < < count3 < < 'n';
  cout < < "Count of numbers divisible by 13: " < < count13 < < 'n';
  return 0;
}

程序輸出結果:

Sample size = 390000
Count of numbers divisible by 3: 130274
Count of numbers divisible by 13: 30009
Count of numbers divisible by 3: 130274
Count of numbers divisible by 13: 30009

Lambda與STL的結合

當STL中的算法(algorithms)庫遇到Lambda的時候,會碰出什么樣的火花呢?毋庸置疑,這極大的提高我們的編程效率,更提高了代碼的整潔性和可讀性,例如:

vector< int > v;
v.push_back(1);
v.push_back(2);
//不使用Lambda表達式
for ( auto itr = v.begin(); itr != v.end(); itr++ )
{
    cout < < *itr;
}

//使用Lambda表達式
for_each( v.begin(), v.end(), [] (int val){cout < < val;} );

正如上面的例子,使用Lambda表達式后,代碼顯的更漂亮,而且它的可讀性也很強,結構更緊湊。

總結

Lambda 引入,使我們在某些情況下,能夠將類似于函數的表達式用作接受函數指針或函數符的函數的參數。它更像膠水代碼,允許我們將簡單的處理邏輯傳遞到需要的位置,提高開發(fā)效率,使得代碼結構簡潔而且易于理解。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • C++語言
    +關注

    關注

    0

    文章

    147

    瀏覽量

    6989
  • STL算法
    +關注

    關注

    0

    文章

    6

    瀏覽量

    5366
  • gcc編譯器
    +關注

    關注

    0

    文章

    78

    瀏覽量

    3380
  • Lambda
    +關注

    關注

    0

    文章

    28

    瀏覽量

    9872
收藏 人收藏

    評論

    相關推薦

    C++的lambda表達式詳解

    lambda 表達式就是一個函數(匿名函數),也就是一個沒有函數名的函數。為什么不需要函數名呢,因為我們直接(一次性的)用它,嵌入式用的它,不需要其他地方調用它。
    發(fā)表于 10-27 10:13 ?1071次閱讀

    Linux內核中C語法擴展-語句表達式

    表達式和語句是 C 語言中的基礎概念。什么是表達式呢?表達式就是由一系列操作符和操作數構成的式子。操作符可以是 C 語言標準規(guī)定的各種算術運
    的頭像 發(fā)表于 02-17 09:30 ?2662次閱讀

    Java Lambda表達式的新特性

    Java Lambda表達式是Java 8中最重要的新特性之一。 它們是一種可傳遞的匿名函數,可以作為參數傳遞給方法或存儲在變量中,因此可以在需要的時候調用它們。 基礎 1. 簡介 Lambda
    的頭像 發(fā)表于 09-30 10:29 ?2585次閱讀

    哪位大神詳細介紹委托、匿名方法、Lambda表達式

    委托、匿名方法、Lambda表達式總結
    發(fā)表于 11-11 07:50

    防范表達式的失控

    C 語言中,表達式是最重要的組成部分之一,幾乎所有的代碼都由表達式構成。表達式的使用如此廣泛,讀者也許會產生這樣的疑問,像+ 、- 、3 、/ 、& & 這樣簡單的運算也會出現
    發(fā)表于 04-22 16:57 ?13次下載

    C語言指針的表達式實例程序說明

    本文檔的主要內容詳細介紹的是C語言指針的表達式實例程序說明。
    發(fā)表于 11-05 17:07 ?4次下載
    <b class='flag-5'>C</b>語言指針的<b class='flag-5'>表達式</b>實例程序說明

    Python正則表達式的學習指南

    本文介紹了Python對于正則表達式的支持,包括正則表達式基礎以及Python正則表達式標準庫的完整介紹及使用示例。本文的內容不包括如何編寫
    發(fā)表于 09-15 08:00 ?0次下載
    Python正則<b class='flag-5'>表達式</b>的學習指南

    Python正則表達式指南

    本文介紹了Python對于正則表達式的支持,包括正則表達式基礎以及Python正則表達式標準庫的完整介紹及使用示例。本文的內容不包括如何編寫
    發(fā)表于 03-26 09:13 ?10次下載
    Python正則<b class='flag-5'>表達式</b>指南

    C語言如何使用正則表達式

    C語言的正則表達式規(guī)則,特此跟大家分享。
    的頭像 發(fā)表于 03-16 08:41 ?4933次閱讀

    Lambda表達式詳解

    C++11中的Lambda表達式用于 **定義并創(chuàng)建匿名的函數對象** ,以簡化編程工作。下面看一下Lambda表達式的基本構成。
    的頭像 發(fā)表于 02-09 11:28 ?1162次閱讀

    C語言的表達式

    C語言中,表達式是由操作符和操作數組成。表達式可以由一個或者多個操作數組成,不同的操作符與操作數組成不同的表達式,因此,表達式才是
    的頭像 發(fā)表于 02-21 15:09 ?1349次閱讀
    <b class='flag-5'>C</b>語言的<b class='flag-5'>表達式</b>

    C++入門之表達式

    表達式是由一個或多個操作符組成的并且返回一個結果。一個最簡單的表達式就是一個變量或者字面量,更加復雜的表達式是由一個操作符和一個或多個操作數組成。
    的頭像 發(fā)表于 03-17 13:55 ?799次閱讀

    Python中的Lambda表達式

    在 Python 中,Lambda 表達式是一種非常強大的工具,它可以讓你快速創(chuàng)建小型匿名函數,而不需要顯式地定義函數名稱。Lambda 表達式通常用于傳遞函數對象或簡單的函數式編程。
    的頭像 發(fā)表于 04-19 15:49 ?825次閱讀

    網絡工程師學Python-Lambda表達式

    在 Python 中,Lambda 表達式是一種非常強大的工具,它可以讓你快速創(chuàng)建小型匿名函數,而不需要顯式地定義函數名稱。Lambda 表達式通常用于傳遞函數對象或簡單的函數式編程。
    的頭像 發(fā)表于 04-19 15:51 ?906次閱讀

    如何使用lambda表達式提升開發(fā)效率?

    Java8 的一個大亮點是引入 Lambda 表達式,使用它設計的代碼會更加簡潔。當開發(fā)者在編寫 Lambda 表達式時,也會隨之被編譯成一
    發(fā)表于 08-24 10:25 ?291次閱讀
    主站蜘蛛池模板: 性春院| 变形金刚7免费观看完整| 国产www视频| 男人的天堂色| 亚洲无码小格式| 妇少水多18P蜜泬17P亚洲乱| 绿巨人www| 亚洲欧美成人无码久久久| 动漫美女被h动态图| 美女爱爱网站| 亚洲欧美综合在线中文| 大乳牛奶女在线观看| 免费观看成人www精品视频在线| 亚洲九九视频| 国产精品2020观看久久| 欧美尤物射精集锦| 91亚洲精品福利在线播放| 精品午夜久久影视| 亚洲 国产 日韩 欧美 在线| 成人a毛片久久免费播放| 免费国产网站| 在镜头里被CAO翻了H| 国产色婷婷精品人妻蜜桃成熟| 日韩欧美1区| A级超碰视频在线观看| 伦理电影2499伦理片| 野花香在线观看免费高清播放视频| 国产精品无码久久av| 色多多污污下载| 草民电影网午夜伦理电影网| 女人高潮被爽到呻吟在线观看| 在线看片av以及毛片| 精品一二三区久久AAA片| 亚洲春色AV无码专区456| 国产精品久久久久久久久免费下载| 日本十八禁无遮拦啪啪漫画| 99久久综合| 男女夜晚在爽视频免费观看| 91国在线啪精品一区| 老师紧窄粉嫩| 最近更新2019中文字幕国语|