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所解決的問題。它可以使程式顯得更加簡潔,更加精神。基本形式 外部變數訪問方式說明符 引數 返回值型別 可以不寫...