C++ 中的 Lambda 函式

Anam Javed 2023年1月30日 2022年4月20日
  1. C++ 中 Lambda 函式的語法
  2. 在 C++ 中使用常規函式指標實現 Lambda 函式
  3. 在 C++ 中使用 std::function 實現 Lambda 函式
  4. 在 C++ 中使用 auto 實現 Lambda 函式
  5. 在 C++ 中使用 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 是一個標準函式指標,僅適用於空捕獲子句。之後,宣告引數的型別 - doubledouble

這稱為函式原型。你可以觀察到一個空的捕獲子句,該子句指示為編譯器建立了一個 Lambda 函式。

此外,在引數列表中傳遞了兩個變數,double adouble 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 adouble 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);
注意
Lambda 也可以是通用的並用於所有資料型別。