lambda 可以方便地定義和建立匿名函式。
[capture list] (params list) mutable exception-> return type
各項具體含義如下
capture list:捕獲外部變數列表
params list:形參列表 (可省略)
mutable指示符:用來說用是否可以修改捕獲的變數 (可省略)
exception:異常設定 (可省略)
return type:返回型別 (可省略,如省略則自動從函式體中判斷返回型別,return後的值。如果沒有則返回void)
function body:函式體
通過在最前面的方括號中輸入一些特殊符號,明確指出哪些外部變數可以被lambda函式捕獲。
(1) 值捕獲[變數名]
函式體內不能改變捕獲變數的值,否則會引起編譯錯誤。相當於函式引數中的值傳遞,會對值進行乙個拷貝。
int main(); a = 321;
f(); // 輸出:123
}
(2) 引用捕獲[&變數名]
相當於函式引數中的引用傳遞,不會做拷貝,其值會隨外部的變數改變而改變。在函式體內可以對變數進行修改。
int main(); a += 1;
f(); // 輸出:125
}
(3) 隱式捕獲 [=] [&]
中不寫明變數名,具體捕獲哪個變數有函式體內的語句自動判斷。也有兩種捕獲方式:
[=]:值捕獲所有外部變數,同(1)值捕獲
[&]: 引用捕獲所有外部變數,同(2)引用捕獲
(4) 混合方式,以逗號分離不同的方式
(5) 關鍵字,修改值捕獲變數,mutable
如果加mutable關鍵字,則表明引數的括號()不能省
intmain()
; //
不會報錯
cout << a << endl; //
輸出:123
f(); //
輸出:124
}
vector myvec;sort(myvec.begin(), myvec.end(), (
int a, int b) -> bool ); //
lambda表示式
16:25:40
lambda表示式 C Lambda表示式
lambda宣告 lambda introducer。在內部,你可以指明乙個capture用來處理外部作用域內未被傳遞為實參的資料。意味著外部作用域以by value的方式傳遞給lambda。在lamdba中不能改變其值 為什麼?意味著外部作用域以by reference的方式傳遞給lambda。因...
C Lambda匿名函式表示式
函式物件引數 形參 mutable 或 exception 宣告 返回值型別 表示表示式的開始,必須有 用來設定如何捕獲匿名函式外的變數 裡為空,表示任何變數都不會傳遞給lambda表示式,沒有引數 int a 10 int b 20 intc int x int 不能捕獲匿名函式外的所有變數 st...
C lambda表示式複習
include include include include using namespace std int main lambda表示式也就是乙個函式,我們可以把它賦給函式指標,也可以在後面加上括號使用。裡面可以新增一些限制lambda塊語句中使用外部變數的限制符。一共有四種情況 1.空白表示不...