一、Lambda表達式是什麼
Lambda表達式是一種C++11新特性,可以用於創建匿名函數,類似於函數指針,但更加靈活和方便。Lambda表達式以一個包含形參列表和函數體的小括號內開頭,後續跟着函數體,函數體可以是任意的有效的C++語句塊。Lambda表達式可以訪問外部作用域中的變量,這些變量可以被捕獲並綁定到Lambda表達式的形參中。
auto sum = [] (int a, int b) -> int {
return a + b;
};
cout << sum(1, 2) << endl;
上述Lambda表達式用於計算兩個整數的和,使用auto
關鍵字進行類型推導,使用[]
表示沒有捕獲任何外部變量,括號內的int a, int b
是Lambda表達式的形參列表,-> int
是返回類型。
二、Lambda表達式的使用場景
Lambda表達式可以在很多場景下使用,比如常用的算法函數std::sort
和std::for_each
,可以使用Lambda表達式來自定義排序或者對元素進行處理。
// 使用Lambda表達式對容器進行排序
std::vector<int> vec = {23, 56, 12, 9, 62};
std::sort(vec.begin(), vec.end(), [] (int a, int b) {
return a < b;
});
// 使用Lambda表達式遍歷容器並輸出
std::vector<int> vec = {23, 56, 12, 9, 62};
std::for_each(vec.begin(), vec.end(), [] (int a) {
std::cout << a << " ";
});
上述代碼中,第一個Lambda表達式用於對vec
進行排序,括號內的int a, int b
表示Lambda表達式的兩個形參,a < b
表示排序規則。第二個Lambda表達式用於遍歷容器vec
,括號內的int a
表示遍歷的元素,std::cout << a << " "
表示對元素的處理。
三、Lambda表達式的捕獲方式
Lambda表達式可以捕獲外部作用域中的變量,並綁定到Lambda表達式的形參中。Lambda表達式可以採用三種捕獲方式:
- 值捕獲:以
=
開頭,表示以值的方式將變量綁定到形參中。 - 引用捕獲:以
&
開頭,表示以引用的方式將變量綁定到形參中。 - 混合捕獲:同時使用
=
和&
,表示以值的方式將除指定變量外的所有變量綁定到形參中,以引用的方式將指定變量綁定到形參中。
// 值捕獲示例
int a = 1, b = 2, c = 3;
auto func1 = [a, b] () {
std::cout << "a = " << a << ", b = " << b << std::endl;
};
func1();
// 引用捕獲示例
int a = 1, b = 2, c = 3;
auto func2 = [&a, &b] () {
a = 4;
b = 5;
};
func2();
std::cout << "a = " << a << ", b = " << b << std::endl;
// 混合捕獲示例
int a = 1, b = 2, c = 3;
auto func3 = [=, &a] () {
std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl;
};
func3();
上述代碼中,func1
使用值捕獲方式,捕獲變量a
和b
,func2
使用引用捕獲方式,引用變量a
和b
,在func2
中修改了變量a
和b
的值,輸出後發現變量a
和b
的值已經修改。func3
使用混合捕獲方式,以值的方式捕獲變量b
和c
,以引用的方式捕獲變量a
,在Lambda表達式中使用了所有捕獲的變量。
四、Lambda表達式的返回值
Lambda表達式可以有返回值,返回值類型可以使用auto
進行類型推導,也可以使用-> 返回類型
進行指定。Lambda表達式的返回值使用return
語句來返回。
// Lambda表達式的返回值示例
auto func = [] (int a, int b) -> int {
return a + b;
};
std::cout << func(1, 2) << std::endl;
上述代碼中,Lambda表達式使用-> int
來指定返回類型為int
,使用return
語句返回兩個整數的和。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/229004.html