Lambda表達式包含一個函數對象參數
標識一個 Lambda 表達式的開始,這部分必須存在,不能省略。函數對象參數是傳遞給編譯器自動生成的函數對象類的構造
函數的。函數對象參數只能使用那些到定義 Lambda 為止時 Lambda 所在作用范圍內可見的局部變量(包括 Lambda 所在類
的 this)。函數對象參數有以下形式:
- 空。沒有任何函數對象參數。
- =。函數體內可以使用 Lambda 所在范圍內所有可見的局部變量(包括 Lambda 所在類的 this),並且是值傳遞方式(相
當於編譯器自動為我們按值傳遞了所有局部變量)。 - &。函數體內可以使用 Lambda 所在范圍內所有可見的局部變量(包括 Lambda 所在類的 this),並且是引用傳遞方式
(相當於是編譯器自動為我們按引用傳遞了所有局部變量)。 - this。函數體內可以使用 Lambda 所在類中的成員變量。
- a。將 a 按值進行傳遞。按值進行傳遞時,函數體內不能修改傳遞進來的 a 的拷貝,因為默認情況下函數是 const 的,要
修改傳遞進來的拷貝,可以添加 mutable 修飾符。 - &a。將 a 按引用進行傳遞。
- a,&b。將 a 按值傳遞,b 按引用進行傳遞。
- =,&a,&b。除 a 和 b 按引用進行傳遞外,其他參數都按值進行傳遞。
- &,a,b。除 a 和 b 按值進行傳遞外,其他參數都按引用進行傳遞
sort函數中lambda表達式使用實例:
class Solution { public: vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) { vector<vector<int>> ret; for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { ret.push_back({i, j}); } } sort(ret.begin(), ret.end(), [=](vector<int>& a, vector<int>& b) {//因為r0,c0是當前函數的局部變量,所以只能使用值傳遞而不能使用引用傳遞造成指針混亂 return abs(a[0] - r0) + abs(a[1] - c0) < abs(b[0] - r0) + abs(b[1] - c0); }); return ret; } };