C++ 中的 Lambda 表達式是一種簡潔的語法結構,允許在代碼中直接定義和使用匿名函數。Lambda 表達式增強了代碼的靈活性和可讀性,特別是在處理算法、函數對象、事件處理、回調函數等場景下尤為有用。其一般格式如下:
[capture_list](parameter_list) -> return_type { function_body }
各部分詳細説明:
-
捕獲列表(Capture List):
-
[]是捕獲列表開始的標誌,可以為空或者包含以下幾種捕獲方式:-
=(值捕獲):捕獲外部作用域中的變量副本,對這些變量的修改不會影響原變量。int x = 10; auto l = [=]() { return x * 2; }; // 捕獲x的值,即使之後x改變,l仍返回20 -
&(引用捕獲):捕獲外部作用域中變量的引用,對這些變量的修改會影響原變量。int y = 20; auto m = [&y]() { ++y; return y; }; // 捕獲y的引用,調用m會增加y的值 this關鍵字:捕獲當前對象的指針,用於在成員函數內部訪問類的成員。- 不指定任何符號時,默認情況下是非靜態局部變量的引用捕獲,同時也會捕獲所有通過值捕獲的外部變量。
複合捕獲也是可能的,例如
[=,&z]意味着除了z通過引用捕獲外,其餘變量都通過值捕獲。 -
-
-
參數列表(Parameter List):
-
這部分和常規函數參數列表類似,用於定義Lambda接受的輸入參數。
auto add = [](int a, int b) { return a + b; };
-
-
返回類型(Return Type):
-
使用
->後跟返回類型表示Lambda的返回值類型,不過在某些情況下可以省略,編譯器可以根據函數體內的返回語句自動推斷返回類型。// 顯式指定返回類型 auto multiply = [](int x, int y) -> int { return x * y; }; // 自動推斷返回類型 auto divide = [](double x, double y) { return x / y; }; // 返回double
-
-
函數體(Function Body):
-
包含Lambda所執行的操作,即實際的函數邏輯。
auto print = []() { std::cout << "Hello, Lambda!" << std::endl; };
-
綜合示例:
#include <iostream>
#include <algorithm>
int main() {
int numbers[]{1, 2, 3, 4, 5};
// 使用lambda表達式作為std::count_if的謂詞
int count_divisible_by_3 = std::count_if(numbers, numbers+5, [](int n) { return n % 3 == 0; });
std::cout << "Numbers divisible by 3: " << count_divisible_by_3 << std::endl;
// 引用捕獲的例子
int total = 0;
auto accumulate_values = [&](int value) -> void {
total += value;
};
for (int i : numbers) {
accumulate_values(i);
}
std::cout << "Total of the numbers: " << total << std::endl;
return 0;
}
在這個示例中:
- 第一個lambda用於計算數組中能被3整除的元素個數,它沒有捕獲任何外部變量,只有一個參數列表,並隱式推斷出返回類型為bool。
- 第二個lambda是一個無返回值的函數對象,捕獲了外部變量total並通過引用,使得每次調用時都能更新total的值。