什么是lamda表达式?
我們首先來(lái)看一下這一片代碼:
1 class Solution { 2 public: 3 int singleNumber(int A[], int n) { 4 // Note: The Solution object is instantiated only once and is reused by each test case. 5 int retval = 0; 6 for_each(A, A+n, [&retval](int val){retval ^= val;}); 7 return retval; 8 } 9 };看一下第六行的代碼,for_each是C++用來(lái)處理container的一個(gè)很好用的東西(雖然只是經(jīng)常用來(lái)print一下),第三個(gè)參數(shù)是個(gè)函數(shù),對(duì)于前面的參數(shù)進(jìn)行處理的函數(shù)。具體可以參考這里。
http://www.cplusplus.com/reference/algorithm/for_each/
?
第三個(gè)參數(shù)就是鼎鼎大名的lamda表達(dá)式了。樓主也是剛知道這是C++11的新特性,對(duì)于用著十年前教材的大學(xué)來(lái)說(shuō)是肯定不會(huì)教的啦==
簡(jiǎn)單來(lái)說(shuō),lamda表達(dá)式就是一個(gè)匿名函數(shù)。
?
基本語(yǔ)法結(jié)構(gòu)是[](){};
其中[]是變量捕獲列表,用來(lái)聲明需要捕獲的外部變量;
()是參數(shù)列表部分;
{}是函數(shù)體部分。
看個(gè)例子:
?
[](int a, int b){ return a + b; };?
C++ Lamda表達(dá)式的參數(shù)列表中參數(shù)需要聲明類型;函數(shù)體不能省略{}符號(hào)和return關(guān)鍵字;即使單條語(yǔ)句時(shí)也不能省略。
顯式聲明需要捕獲的外部變量,舉個(gè)栗子:
1 void HostingFunction() 2 { 3 int c = 1; 4 auto f = [c](int a, int b){ return a + b + c; }; 5 }代碼中聲明了需要捕獲外部變量c,則函數(shù)體中即可引用變量c,否則不能引用。不同于C# Lamda表達(dá)式,上述例子中對(duì)變量c的改變并不能影響f的行為,因?yàn)椴东@的c是以值類型捕獲的,也即是一份拷貝。如果對(duì)變量c采取按引用的方式捕獲,則變量c的改變會(huì)影響f的行為。如下:
1 void HostingFunction() 2 { 3 int c = 1; 4 auto f = [&c](int a, int b){ return a + b + c; }; 5 }這個(gè)時(shí)候,我們就可以看懂文章最開(kāi)始的代碼了~
1 int retval = 0; 2 for_each(A, A+n, [&retval](int val){retval ^= val;});表示retval對(duì)于每個(gè)val進(jìn)行異或操作。最后的結(jié)果保存在retval中。
這個(gè)題目是:https://leetcode.com/problems/single-number/
具體為什么要異或呢,大家想一想吧~~~
轉(zhuǎn)載于:https://www.cnblogs.com/shenbingyu/p/4643822.html
總結(jié)
以上是生活随笔為你收集整理的什么是lamda表达式?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HDU 4391 Paint The W
- 下一篇: PHP的MVC模型