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

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

3天內(nèi)不再提示

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

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

為什么引入Lambda

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

基本的Lambda語法

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

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


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

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

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

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

程序輸出結(jié)果:

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的結(jié)合

當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表達式后,代碼顯的更漂亮,而且它的可讀性也很強,結(jié)構(gòu)更緊湊。

總結(jié)

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

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

    關注

    0

    文章

    147

    瀏覽量

    6951
  • STL算法
    +關注

    關注

    0

    文章

    6

    瀏覽量

    5358
  • gcc編譯器
    +關注

    關注

    0

    文章

    78

    瀏覽量

    3346
  • Lambda
    +關注

    關注

    0

    文章

    28

    瀏覽量

    9848
收藏 人收藏

    評論

    相關推薦

    C++的lambda表達式詳解

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

    Linux內(nèi)核中C語法擴展-語句表達式

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

    Java Lambda表達式的新特性

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

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

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

    防范表達式的失控

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

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

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

    Python正則表達式的學習指南

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

    Python正則表達式指南

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

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

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

    Lambda表達式詳解

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

    C語言的表達式

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

    C++入門之表達式

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

    Python中的Lambda表達式

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

    網(wǎng)絡工程師學Python-Lambda表達式

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

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

    Java8 的一個大亮點是引入 Lambda 表達式,使用它設計的代碼會更加簡潔。當開發(fā)者在編寫 Lambda 表達式時,也會隨之被編譯成一
    發(fā)表于 08-24 10:25 ?270次閱讀