C/C++中Lambda函式的意義


Lambda函式 − Lambda函式是無需在主程式作用域之外進行任何實現的行內函數。

Lambda函式也可以作為變數的值來儲存。Lambda可以被稱為可以由函式呼叫的物件(稱為函子)。

每當編譯器遇到lambda函式的定義時,它通常會為lambda建立一個自定義物件。

Lambda函式比普通函式具有更多功能,例如,它具有捕獲方法來捕獲使用的變數。但是,捕獲的變數被視為物件的成員。

有時lambda函式也稱為“函式物件”,它擁有自己的作用域,可以作為引數傳遞到普通函式中。Lambda函式有其自身的生命週期。

[ ] - 捕獲

( ) - 引數(可選)

- 返回值(可選)

{...} - 函式體。

lambda語法

[ ]( int a) -> int { return a-1 ;};

捕獲 – 捕獲是一個子句,透過它,lambda函式可以訪問在特定作用域或巢狀塊中可用的變數。

我們可以使用兩種方法捕獲可用變數的值:

  • 按名稱捕獲物件 – 按名稱捕獲物件會為lambda函式建立一個區域性副本。

我們可以透過以下示例來理解這個概念:

int main(){
   set s;
   //Adding the elements to set
   int i=20;
   for_each(s.begin(),s.end(), [i](T& elem){
      cout<<elem.getVal()*i<<endl;
   }
}

在上面的示例中,透過建立lambda函式的區域性副本來捕獲值。

  • 按引用捕獲物件 – 按引用捕獲物件會操作lambda函式的上下文。因此,函式物件或lambda函式捕獲的值可以更改。

我們可以透過以下示例來理解這一點:

int main(){
   sets;
   //Adding elements to the set
   int result=0;
   for_each(s.begin(),s.end(), [&result](&T elem){ result+= elem.getVal();});
   cout<<result<<endl;
}

成員函式內的Lambda

我們知道lambda函式可以用作任何普通函式內的引數。例如:

class func{
public:
   func(set<T>s): s1(s){}
   void func(){
      remove_if(s1.begin(),s1.end(), [this](int i) ->bool {return (i<level);});
   }
private:
   set<T>s1;
   int result;
};

更新於:2021年2月5日

4K+ 瀏覽量

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.