C++ 中的 Lambda 函式
- C++ 中 Lambda 函式的語法
- 在 C++ 中使用常規函式指標實現 Lambda 函式
-
在 C++ 中使用
std::function
實現 Lambda 函式 -
在 C++ 中使用
auto
實現 Lambda 函式 - 在 C++ 中使用 Lambda 函式
本文將詳細討論 C++ 中 Lambda 函式的語法和實現,以及相關示例。
在 C++ 中,Lambda 函式或匿名函式是在另一個函式中匿名定義的。它在原始碼中內聯編寫,並作為引數傳遞給另一個接受可呼叫物件的函式。
這使得 C++ 程式設計師可以輕鬆快速地建立函式。這些函式沒有名稱,也沒有被重用。
C++ 中 Lambda 函式的語法
一般語法:
[Capture List](Parameter List) { Function Body; }
Capture List
告訴編譯器建立了一個 lambda 函式。
要在函式體內使用任何變數,首先,我們需要在捕獲列表中捕獲它。如果不這樣做,它將超出函式體的範圍。
捕獲的變數可以作為副本或引用訪問。捕獲變數不被視為在普通函式中傳遞引數。
這裡,a
是按值捕獲的:
auto f = [a]() { return a * 9; };
在這裡,a
是通過引用捕獲的:
auto f = [&a]() { return a++; };
引數列表
,顧名思義,它像普通函式一樣在其中接受引數。如果沒有要傳遞的引數,它是可選的。
使用 ()
:
auto call_foo = [x]() { x.foo(); };
沒有 ()
:
auto call_foo2 = [x] { x.foo(); };
上面這兩個 lambda 函式具有相同的含義。
Function Body
包含要執行的程式碼,就像任何其他常規函式一樣。
int mul = 5;
auto ans = [mul](int a) { return a * mul; };
std::out << ans(2);
輸出:
5
C++ 中的 Lambda 函式示例:
#include <iostream>
#include <string>
using namespace std;
int main() {
auto sum = [](int a, int b) { return a + b; };
cout << "Sum of two integers:" << sum(5, 5) << endl;
return 0;
}
輸出:
Sum of two integers: 10
我們使用 auto
關鍵字來指示引數的資料型別將在執行時確定。這將在以下各節中進一步討論。
在 C++ 中使用常規函式指標實現 Lambda 函式
我們可以使用函式指標在 C++ 中實現 lambda 函式。
int main() {
double (*addNum1)(double, double){[](double a, double b) { return (a + b); }};
addNum1(1, 2);
}
輸出:
3
這裡,*addNum1
是一個標準函式指標,僅適用於空捕獲子句。之後,宣告引數的型別 - double
、double
。
這稱為函式原型。你可以觀察到一個空的捕獲子句,該子句指示為編譯器建立了一個 Lambda 函式。
此外,在引數列表中傳遞了兩個變數,double a
和 double b
。並且,在函式體內,返回這些變數的加法。
在 main 函式關閉後,函式 addNum(1,2)
被呼叫並返回 3 作為輸出。
在 C++ 中使用 std::function
實現 Lambda 函式
std::function addNum{[](double a, double b) { return (a + b); }};
addNumbers2(3, 4);
輸出:
7
std::function
將 lambda 函式作為引數和返回值傳遞。它允許你在模板中宣告引數列表和返回值的確切型別。
在這裡,引數列表中傳遞了兩個變數,double a
和 double b
。並且,在函式體內,返回這些變數的加法。
在 main 函式關閉後,函式 addNum(1,2)
被呼叫並返回 7 作為輸出。
在 C++ 中使用 auto
實現 Lambda 函式
auto addNum{[](double a, double b) { return (a + b); }};
addNum(5, 6);
return 0;
輸出:
11
我們不能直接使用 lambda,因為它們沒有型別。因此,當我們建立一個 lambda 函式時,編譯器會構造一個唯一型別的引數。
雖然我們不知道它是什麼型別的 lambda 函式,但是有很多方法可以在定義後儲存它以供使用。使用 lambda 真實型別的唯一方法是通過 auto
。
將 Lambda 函式宣告為 auto
後,可以在 C++ 程式中的任何位置使用。
在 C++ 中使用 Lambda 函式
Lambda 表示式通常用於封裝演算法以將它們傳遞給另一個函式。
lambda 函式可以在定義後立即執行:[ ](double a, double b)
。
{return (a + b)}(); // immediately executed lambda expression
{ return (a + b) } // simple code block
正如我們所見,lambda 表示式是重構複雜函式的有效工具。
然後可以逐步執行顯式引數化過程,中間進行中間測試。一旦程式碼塊被適當地引數化,將其重新定位到外部位置並使其成為正常功能。
Lambda 表示式還允許構建命名巢狀函式,這有助於刪除不必要的邏輯。當將一個重要的函式作為引數傳遞給另一個函式時,使用命名的 lambdas 對眼睛來說更容易。
auto algo = [&](double x, double m, double b) -> double { return mx + b; };
int l = algorithm(1, 2, 3), m = algorithm(4, 5, 6);