C 學習筆記 lambda表示式

2021-10-05 17:16:05 字數 1839 閱讀 9949

lambda表示式本質上是一種函式,只要掌握了函式的寫法,完全不學lambda表示式也沒問題。

但是,既然有lambda表示式,就有它存在的道理。與通常定義的函式相比,lambda表示式其實是一種匿名函式,就是lambda定義的函式沒有名字。與有名字的函式相比,lambda更簡潔,更適合定義一些功能簡單、一次呼叫的函式,可以提高編碼效率。另外,就算你打死也不用lambda,至少你需要擁有看懂別人寫的lambda的能力吧?

lambda表示式是c++的一種語法糖,是呼叫的時候才定義的函式,是一種隨性的生活狀態,是為沒有準備也能把握住機會的人而設。

lambda大概長什麼樣子呢?

const

int lowerlimit =5;

int smallvalue;

smallvalue =[=

](int x,

int y)

->

int(6,

9);cout << smallvalue << endl;

smallvalue等號右邊的就是乙個lambda表示式。

如果用普通函式的寫法,應該是這個樣子:

const

int lowerlimit =5;

intfoo

(int x,

int y)

intmain()

這個例子中的lambda表示式總共有5部分。

1. [=]

是捕獲語句,我認為叫外部訪問標識更容易理解,不知為何叫capture。它的作用是告訴函式,你應該如何訪問函式體外的變數。比如,該例中使用到了lowerlimit變數。

外部訪問標識三種基本表達: 、[=]、[&]

它們的含義分別是什麼也不訪問、按值訪問、按引用訪問

按值和按引用訪問也可以指定具體的變數名,指定後表示僅可以訪問這個變數,不指定則表示可訪問全部。如果指明某變數按值訪問,直接寫上該變數即可,不需新增=號。如有外部變數 u、v、w, [u]表示僅按值訪問u, [&u]表示按引用訪問u. [u, &v]表示u按值訪問,v按引用訪問。[=, &w]表示w按引用訪問,其它變數全部按值訪問。[v, &]表示v按值訪問,其餘全部按引用訪問。

2. (int x, int y)

這一部分是函式的引數, 相法於 foo函式的(int x, int y)。如果沒有引數,直接()即可。

3. ->int

這一部分是標明函式返回值型別, 如果返回值是float, 表示式就是->float。如果沒有返加值,這一部分可以直接省略。或者如果在函式體中有return 值, 也可以省略這一部分。如例子中去掉 ->int 也沒問題。

4.

這一部分就是函式體,相當於foo(int x, int y)中里的內容。

5. (6, 9)

這一部分是對函式的具體呼叫,相當於foo(6, 9)

事實上,在這個例子中,我們在2和3部分之間還省略了兩個東西:

乙個是mutable,乙個是exception,如throw()

更詳細的內容可參考微軟文件:lambda expressions in c++

除了在lambda表示式上直接呼叫函式外(如(6,9) ), 也可以先將lambda表示式賦給乙個函式變數,然後再呼叫,如:

auto f1 =

(int x,

int y)

;cout <2,3)

<< endl;

但不明白auto f1 有啥用,如果要這樣寫, 乾脆寫個一般函式再呼叫好了。

C 學習筆記 lambda表示式

在使用委託的時候,除了將乙個已存在的方法賦給乙個委託之外,還可以使用匿名方法的方式。使用匿名方法的時候,需要乙個delegate關鍵字,並且方法的引數列表要和委託定義的完全一樣。這裡有乙個匿名方法 func add delegate int a,int b console.writeline 操作的...

C 學習筆記 Lambda表示式

之前在用 linq to sql 時使用過 運算子來進行資料的操作,當時不是很明白這個運算子的 今天碰到一段 也使用這個運算子,甚是好奇。這個運算子是 c 3.0 之後才加進來的,是 lambda 運算子,該運算子讀作 goes to 該運算子左邊是輸入的引數,右邊可以是乙個語句也可以是乙個程式塊。...

學習筆記 Lambda表示式

lambda表示式是c 11中的乙個新特性。如果乙個函式物件只需要呼叫一次,還要專門為其編寫乙個類嗎?如果乙個簡單函式只需要呼叫一次,能否在呼叫時才寫出函式體呢?必須可以,這就是lambda所解決的問題。它可以使程式顯得更加簡潔,更加精神。基本形式 外部變數訪問方式說明符 引數 返回值型別 可以不寫...