自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C++ 中 Lambda 表達式的快速指南

開發(fā) 后端
作為語言演變帶來的更新的一部分,C++ 在其 2011 版本中增加了對 lambda 表達式的支持。

編程語言不斷發(fā)展,甚至像 C++ 這樣很久以前就確立了自己的語言。他們向標準庫添加功能并進行其他更改以簡化程序員在動態(tài)領域工作的工作。

作為語言演變帶來的更新的一部分,C++ 在其 2011 版本中增加了對 lambda 表達式的支持。

什么是 lambda 表達式,作為 C++ 程序員,您如何利用它來發(fā)揮自己的優(yōu)勢?

什么是 Lambda 表達式?

lambda 表達式也稱為 lambda 函數(shù)。它是一個內(nèi)聯(lián)表達式,能夠接受參數(shù)、執(zhí)行操作和返回值,就像典型的函數(shù)一樣。

您可以在另一個函數(shù)中使用 lambda 并將其分配給變量。Lamba 函數(shù)是在程序中定義匿名函數(shù)對象的一種實用方法。幾乎每種語言都支持 lambda,盡管每種實現(xiàn)都各不相同。

C++ Lambda 表達式有哪些部分?

Lambda 表達式在 C++ 中很容易使用。您可以在 C++ 中分解 lambda 表達式的語法,如下所示:

[capture_clause](parameters) options { expression_body; }

例如:

int val = 13;
auto sumPlusVal = [val](int a, int b) mutable noexcept ->int { return val + a + b ; };
sumPlusVal(2, 5); // 20

這段代碼聲明了sumPlusVal變量 auto,因為 lambda 表達式可以接受和返回任何數(shù)據(jù)類型。這讓編譯器在編譯期間確定類型。

從上面的代碼中,您可以看到一個 lambda 表達式包含幾個部分,這些部分指定了它的操作方式。以下是每個組件的快速概述。

  1. 捕獲子句(Capture Clause):這是 lambda 表達式的第一部分,您可以在其中指定預先存在的變量或定義要在表達式主體中使用的新變量。有不同的方法來指定捕獲,例如:
auto addTwo = [foo](){ return foo + 2; }; // by value
auto addThree = [&bar](){ return bar + 3; }; // by reference
auto addAllVal = [=](){ return foo + bar; }; // all by value
auto addAllRef = [&](){ return foo + bar; }; // all by reference
// create a variable in capture clause
auto createVarInCapture = [fooBar = foo + bar](){ return fooBar * 5; };
// no capture - returns error because foo is not accessible
auto errorExpression = [](){ return foo + 2; };
  1. 參數(shù)(Parameters):這部分 lambda 表達式也是可選的。它包含 lambda 所需的函數(shù)參數(shù)。這與您在 C++ 中定義函數(shù)參數(shù)的通常方式?jīng)]有任何不同。
  2. 選項(Options):您還可以在定義 lambda 表達式時指定選項。您可以使用的一些選項是:mutable、exception(例如第一個示例代碼中的noexcept )、 ->return_type(例如->int)、requires、attributes等。經(jīng)常使用mutable選項,因為它允許在內(nèi)部修改捕獲拉姆達。下面的代碼演示了這一點。
int value = 10;
// returns an error - value is a const inside the expression
auto decrement = [value](){ return --value; };
auto increment = [value]() mutable { return ++value; };
increment(); // 11
  1. 盡管其他選項很少使用,但您可以在cppreference.com的 lambdas 頁面上獲得有關它們的更多信息。
  2. 表達式主體(Expression body):這是 lambda 表達式的主體,它執(zhí)行并返回一個值,就像函數(shù)一樣。如有必要,您可以將 lambda 表達式的主體拆分為多行。但是,最好的做法是盡可能簡短,以防止代碼混亂。

Lambda 表達式有什么好處?

在代碼中使用 lambda 函數(shù)有很多優(yōu)點。除了提高開發(fā)速度和效率之外,您從 lambdas 獲得的最大好處如下:

  •  Lambda 表達式有助于保持代碼整潔。保持代碼簡單整潔的最佳方法之一是盡可能使用 lambda。這對于維護可讀和可重用的代碼結構非常有幫助。
  •  您可以將 lambdas 作為參數(shù)傳遞給其他函數(shù)。C++ 標準庫的 std::sort() 方法利用了這一優(yōu)勢。您可以將 lambda 作為此方法的參數(shù)之一傳遞,以指定函數(shù)應如何執(zhí)行排序。例如:
std::vector<int> arr = {2, 5, 1, 3, 4};
std::sort(arr.begin(), arr.end(), [](int a, int b){ return a < b; });
// arr = {1, 2, 3, 4, 5}

  •  Lambda 是可重用的。有時,您可能希望在程序中的函數(shù)范圍內(nèi)使代碼塊可重用,而不必定義新函數(shù)。在這種情況下,Lambda 非常有用??紤]以下可重用 lambda 表達式的示例:
#include <iostream>
using namespace std;
int main() {
// define a reusable lambda
auto addUp = [](auto a, auto b, auto c) noexcept {
cout << "Now adding up... " << a << ", " << b << " and " << c << endl;
return a + b + c ;
};
cout << addUp(22, 33, 44) << endl;
cout << addUp(string("Happy "), string("Birth"), string("day")) << endl;
cout << addUp(true, false, true) << std::endl; // executes as numbers(1 and 0)
}

該程序產(chǎn)生以下結果:

此示例演示了定義 lambda 是多么簡單,以便您可以將其與任何類型一起使用。

在 C++ 中使用 Lambda

lambda 表達式還有許多其他好處,隨著程序結構變得越來越復雜,您會發(fā)現(xiàn)它們。事實上,C++ 程序員有時將 lambda 表達式稱為閉包,因為它們是在代碼中實現(xiàn)閉包的好方法。

如果要將現(xiàn)代 C++ 概念合并到代碼庫中,則應考慮使用 lambda 表達式。

責任編輯:龐桂玉 來源: Linux公社
相關推薦

2020-10-16 06:40:25

C++匿名函數(shù)

2023-03-23 18:40:18

Lambda編程C++

2023-11-02 08:25:58

C++Lambda

2024-03-25 13:46:12

C#Lambda編程

2009-07-09 09:51:07

Lambda表達式C#

2023-09-25 13:28:14

C++Lambda

2009-07-01 09:56:10

C#3.0

2009-08-27 09:44:59

C# Lambda表達

2010-10-19 10:03:02

Lambda表達式

2023-12-13 10:12:40

Python函數(shù)lambda

2009-08-26 16:17:23

C# Lambda表達

2009-08-27 09:57:50

C# Lambda表達

2009-09-14 13:57:20

C# Lambda表達Lambda表達式

2021-08-31 07:19:41

Lambda表達式C#

2012-06-26 10:03:58

JavaJava 8lambda

2009-09-11 09:48:27

Linq Lambda

2009-09-09 13:01:33

LINQ Lambda

2009-09-15 15:18:00

Linq Lambda

2022-12-05 09:31:51

接口lambda表達式

2010-09-14 14:05:42

C#委托
點贊
收藏

51CTO技術棧公眾號