lambda 表示式實際上是乙個函式,只是它沒有名字,叫匿名函式。c++11新增了lambda函式,其基本格式如下:
[捕捉列表] (引數) mutable -> 返回值型別
一、c++中使用lambda
"捕捉列表",也叫「外部變數訪問方式說明符」,可以是=
或&
,表示{}
中用到的、定義在{}
外面的變數在{}
中是否允許被改變。=
表示不允許,&
表示允許。當然,在{}
中也可以不使用定義在外面的變數。「-> 返回值型別」可以省略。
[var] 表示以值傳遞方式捕捉變數var
[=] 表示值傳遞捕捉所有父作用域變數
[&var] 表示以引用傳遞方式捕捉變數var
[&] 表示引用傳遞捕捉所有父作用域變數
[this] 表示值傳遞方式捕捉當前的this指標
還有一些組合:
[=,&a] 表示以引用傳遞方式捕捉a,值傳遞方式捕捉其他變數
注意:捕捉列表不允許變數重複傳遞,如:[=,a]、[&,&this],會引起編譯時期的錯誤
「外部變數訪問方式說明符」還可以有更加複雜和靈活的用法。例如:
[=] (int x, int y) -> bool
例子:
int a[4] = ;
sort(a, a+4, [=](int x, int y) -> bool );
for_each(a, a+4, [=](int x) );
輸出結果:5,2,9,4
例子2(用到外部變數):
#include #include using namespace std;
int main()
;int total = 0;
for_each(a, a + 4, [&](int & x) );
cout << total << endl; //輸出 10
for_each(a, a + 4, [=](int x) );
return 0;
}
輸出結果:
102 4 6 8
第乙個for_each,[&]
表示該 lambda 表示式中用到的外部變數 total 是傳引用的,其值可以在表示式執行過程中被改變(如果使用[=]
,編譯無法通過)。該 lambda 表示式每次被 for_each 執行時,都將 a 中的乙個元素累加到 total 上,然後將該元素加倍。
例子3
int main(int argc, char* ar**)
; //接受兩個引數
cout << total(a, b)int t = fun4(10, 20);
cout << t << endl; //42
cout << a <<" "<< b << endl; //5 7
return 0;
}
1.總結
1.lambda表示式(){},配合訊號與槽使用特別方便,c++11新標準 在.pro 檔案裡面新增 config += c++11 之後可以使用。
2.這個方括號是用來傳遞外部變數的, 因為在匿名函式中是無法使用外部變數的, 只能通過方括號傳遞給他, 才能捕獲到. 比如我需要使用a這個變數,
只需要在方括號中加入a即可:[a](){};但是如果要傳的變數很多, 乙個個加到方括號裡就太麻煩了, 這時我們可以使用 '=', 將外部所有區域性變數、類中
所有成員以值傳遞方式傳進來: [=] (). 但是通過這種方式傳遞進來的變數是唯讀的, 不能修改;
3.使用 this, 可以把類中所有成員以值傳遞方式傳遞進來;[this](){}
4.使用 &, 把外部所有區域性變數, 通過引用方式傳遞進來(不推薦, 容易出錯);
5.{}花括號內為匿名函式的邏輯**;
connect(chk, &qcheckbox::clicked, [=](bool checked));
Lambda表示式用法
c 2.0的匿名方法允許我們以內聯的方式來實現委 託例項,而c 3.0的lambda表示式允許我們使用一 種更接近人的思維 更自然的方式來實現類似於匿 名方法同樣的效果。lambda表示式格式為 引數列表 表示式或者語句塊 可以有多個引數,乙個引數,或者無引數。引數型別 可以隱式或者顯式。例如 x,...
lambda表示式 lambda表示式
1.概述 c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 muta...
Lambda表示式的用法
1 函式式程式設計思想概述 在數學中,函式就是有輸入量 輸出量的一套計算方案,也就是 拿什麼東西做什麼事情 相對而言,物件導向過分強調 必須通過物件的形式來做事情 而函式式思想則盡量忽略物件導向的複雜語法 強調做什麼,而不是以什麼形式做。2 lambda標準格式 lambda省去物件導向的條條框框,...