C++ lambda表示式(詳解版)

2020-07-16 10:04:41
Lambda 表示式是從類建立函數物件的精簡方式。這裡講的類,它僅有的成員就是函數呼叫運算子。

Lambda 表示式取消了類宣告,並且使用了精簡的符號來表示函數呼叫運算子的邏輯。例如,以下函數物件的Lambda表示式可以計算兩個整數之和:

[](int a, int b) { return x + y; }

以下函數物件的 Lambda 表示式可以確定某個整數是否為偶數:

[](int a) { return a % 2 == 0; }

以下 Lambda 表示式釆用了一個整數作為輸入,然後列印該整數的平方值:

[](int a) { cout << a * a << " "; }

以上顯示的 Lambda 表示式其實是函數的基礎定義,但函數的名稱和返回型別則使用 一對空白方括號[]來替代。Lambda 表示式經常釆用以下形式:

[捕獲從句](形參列表){函數體}

捕獲從句是 Lambda 表示式作用域中的變數列表,可以從 Lambda 表示式的函數體存取。這與常規函數定義列出所有可以存取的全域性變數相似。本節所使用的 Lambda 表示式均不使用捕獲從句,所以對這個概念不做進一步的討論。

Lambda 表示式通過在它後面放置一個真實形參列表來呼叫。例如,以下程式碼段將列印值 7,也就是變數 x 和 y 之和:
int x = 2;
int y = 5;
cout << [](int a, int b) { return a + b;} (x, y);
以下程式碼段將按降序對陣列排序,它使用了 Lambda 表示式來代替函數物件作為排序函數的第 3 個引數:
double d_values[]{ 12.7, 45.9, 6.9};
//以降序排序陣列
sort( begin(d_values), end(d_values),[](auto a, auto b) {return a > b;});
//列印陣列
for (auto x : d_values)
{
    cout << x << " ";
}
因為 Lambda 表示式是函數物件,所以,可以將 Lambda 表示式賦值給一個型別適合的變數,並通過變數名來呼叫它。

例如,可以按如下方式給 Lambda 表示式分配一個名稱:

auto compare = [](auto a, auto b) {return a > b;};

這樣做可以將程式碼分割成更小的塊,使它更易讀。以下就是將上面的程式碼段重新編寫,參照變數(變數的值為 Lambda 表示式)之後的結果:
double d_values[]{ 12.7, 45.9, 6.9};
// Lambda表示式
auto compare = [](auto a, auto b) {return a > b;};
//以降序排序陣列
sort( begin(d_values), end(d_values),compare);
//列印陣列
for (auto x : d_values)
{
    cout << x << " ";
}