C++:Lambda表達式
- C++中`lambda`的基本語法
- 1. 捕獲列表(Capture List)
- 2. 示例代碼
- 示例 1:簡單的`lambda`
- 示例 2:捕獲變量
- 示例 3:按引用捕獲
- 示例 4:捕獲所有變量
- 示例 5:作為函數參數
- 3. `lambda`的高級特性
- 4. 適用場景
- 5. 注意事項
- 總結
在C++中,lambda
表達式是一種強大的特性,用于創建匿名函數對象。它從C++11標準開始引入,并在后續版本中不斷完善。lambda
表達式在C++中廣泛應用于標準庫算法(如std::sort
、std::for_each
等)以及其他需要函數對象的場景。
代碼鏈接:https://gitee.com/hu_yuchen/C++11/lambda
C++中lambda
的基本語法
C++的lambda
表達式語法如下:
[capture](parameters) -> return_type { body }
capture
:捕獲列表,用于捕獲當前作用域中的變量。parameters
:參數列表,類似于普通函數的參數。-> return_type
:返回類型(可選)。如果不指定,編譯器會自動推導返回類型。body
:函數體,包含具體的邏輯。
1. 捕獲列表(Capture List)
捕獲列表用于將當前作用域中的變量捕獲到lambda
表達式中。捕獲方式有以下幾種:
- 按值捕獲:使用
[x]
捕獲變量x
的副本。 - 按引用捕獲:使用
[&x]
捕獲變量x
的引用。 - 捕獲所有變量:使用
[=]
按值捕獲當前作用域中所有變量。 - 捕獲所有變量的引用:使用
[&]
按引用捕獲當前作用域中所有變量。 - 混合捕獲:可以同時使用按值和按引用捕獲,例如
[x, &y]
。
2. 示例代碼
以下是一些C++中lambda
表達式的典型用法:
示例 1:簡單的lambda
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用 lambda 表達式作為回調函數std::for_each(vec.begin(), vec.end(), [](int x) {std::cout << x << " ";});std::cout << std::endl;return 0;
}
輸出:
1 2 3 4 5
示例 2:捕獲變量
#include <iostream>
#include <vector>
#include <algorithm>int main() {int factor = 2;std::vector<int> vec = {1, 2, 3, 4, 5};// 按值捕獲變量 factorstd::for_each(vec.begin(), vec.end(), [factor](int x) {std::cout << x * factor << " ";});std::cout << std::endl;return 0;
}
輸出:
2 4 6 8 10
示例 3:按引用捕獲
#include <iostream>
#include <vector>
#include <algorithm>int main() {int factor = 2;std::vector<int> vec = {1, 2, 3, 4, 5};// 按引用捕獲變量 factorstd::for_each(vec.begin(), vec.end(), [&factor](int x) {std::cout << x * factor << " ";factor++; // 修改捕獲的變量});std::cout << std::endl;std::cout << "Final value of factor: " << factor << std::endl;return 0;
}
輸出:
2 6 12 20 30
Final value of factor: 7
示例 4:捕獲所有變量
#include <iostream>
#include <vector>
#include <algorithm>int main() {int a = 2;int b = 3;// 捕獲所有變量auto lambda = [=](){ return a * b; };std::cout << "Result: " << lambda() << std::endl;return 0;
}
輸出:
Result: 6
示例 5:作為函數參數
#include <iostream>
#include <vector>
#include <algorithm>void processVector(const std::vector<int>& vec, void (*func)(int)) {for (int x : vec) {func(x);}
}int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用 lambda 表達式作為函數參數processVector(vec, [](int x) {std::cout << x * x << " ";});std::cout << std::endl;return 0;
}
輸出:
1 4 9 16 25
3. lambda
的高級特性
- 可調用對象:
lambda
表達式本質上是一個可調用對象,可以賦值給std::function
或其他支持函數調用的類型。 - 默認捕獲模式:可以指定默認捕獲模式,例如
[=, &x]
表示按值捕獲所有變量,但x
按引用捕獲。 mutable
關鍵字:如果lambda
需要修改捕獲的變量,可以在lambda
表達式中使用mutable
關鍵字。auto lambda = [x = 5]() mutable { x++; std::cout << x << std::endl; }; lambda(); // 輸出 6
4. 適用場景
- 標準庫算法:如
std::sort
、std::for_each
、std::transform
等,lambda
表達式可以作為回調函數傳遞。 - 線程創建:在
std::thread
中,可以使用lambda
表達式作為線程函數。 - 事件處理:在GUI編程或事件驅動的場景中,
lambda
表達式可以作為事件處理器。 - 簡化代碼:對于簡單的函數邏輯,
lambda
可以減少代碼量,使代碼更簡潔。
5. 注意事項
- 捕獲變量的生命周期:如果捕獲了局部變量的引用,需要確保
lambda
表達式在變量生命周期內使用,否則可能導致未定義行為。 - 性能開銷:雖然
lambda
表達式通常不會引入額外的性能開銷,但捕獲大量變量可能會增加內存使用。 - 復雜邏輯:對于復雜的邏輯,建議使用普通函數而不是
lambda
表達式,以提高代碼的可讀性。
總結
C++中的lambda
表達式是一種非常靈活和強大的特性,適用于需要簡單函數對象的場景。通過合理使用捕獲列表和參數列表,可以實現簡潔高效的代碼。