小喵的嘮叨話:
寒假之后,小喵在家里無所事事,最近用C++寫代碼的時候,用到了std::sort這個函數,每次用這個函數,小喵似乎都得查一下lambda表達式的寫法。正好最近很閑,不如總結一下。
在Bing上搜索 C++ lambda ,第一條記錄就是MSDN上的C++ lambda的介紹。本文也是基于這篇文章來寫的。
那么接下來,我們分幾個部分來介紹。
一、什么是Lambda表達式
MSDN上對lambda表達式的解釋:
在 C++ 11 中,lambda 表達式(通常稱為 “lambda”)是一種在被調用的位置或作為參數傳遞給函數的位置定義匿名函數對象的簡便方法。 Lambda 通常用于封裝傳遞給算法或異步方法的少量代碼行。 [1]
看了這個解釋,相信大家已經理解lambda表達式是什么。簡而言之,lambda表達式就是一種定義函數的簡單的方法。
舉一個簡單的例子:求一個數的階乘。
這是一般的函數的寫法:
// 這里要求n>=0,同時n的取值不能太大,會溢出// 為了方便,這里并沒有處理上面說到的問題int factorial(int n) { int fact = 1; for (int i = 1; i <= n; ++ i) fact *= i; return fact;}Lambda表達式的寫法:
autofactorial = [](int n) { int fact = 1; for (int i = 1; i <= n; ++ i) fact *= i; return fact;};乍一看,這兩種定義方式十分的相似。但其實這是兩種完全不同的方式,前一種是函數定義式,而后一種是一個表達式。factorial是變量名,等于號后面的是值,也就是一個lambda表達式,本質上是一個匿名的函數。最終factorial就是一個函數。
很多時候,我們只是直接書寫lambda表達式,而不需要給他一個名字。比如排序的時候,sort可以接受一個自定義的比較函數,這時候直接書寫lambda表達式即可。
二、Lambda表達式的作用
由于lambda本身其實也就是一種函數的定義方式。因此它的主要作用還是和一般函數一樣。但是lambda表達式相對于一般函數,又有一些功能之外的作用。參考了知乎上的一些回答 [2] ,小喵也進行了總結。
1、可以用表達式來定義函數,這樣使得函數的定義和調用在一起,語意和邏輯上更為緊湊。同時,對于只是用一次的短小的函數,直接調用匿名的lambda表達式是最好的選擇,這樣就不需要給每個函數起名字了。 /* 起名字一直是一個很令人頭疼的問題 */
2、閉包(Closure)。這個小喵的寫javascript的時候時常會用到。閉包本質上就是能夠訪問上下文環境中變量的代碼塊。
這里我們簡單的舉個例子,還是之前的求階乘的問題,現在我們有些提高需求。
現在需要完成下面的三種階乘的運算:
n! = n * (n 主站蜘蛛池模板: 普定县| 大渡口区| 镇平县| 威海市| 巩留县| 宝兴县| 固安县| 孝感市| 霍山县| 无极县| 南康市| 平阳县| 磐石市| 环江| 南郑县| 扶风县| 洛川县| 灵石县| 桐乡市| 泸西县| 思茅市| 临高县| 深水埗区| 莲花县| 古丈县| 读书| 舒城县| 盐城市| 灌云县| 葵青区| 六枝特区| 张掖市| 常山县| 孟州市| 新河县| 齐河县| 和平县| 香港| 清原| 十堰市| 梅河口市|