Computer >> Máy Tính >  >> Lập trình >> lập trình C

Ý nghĩa của hàm Lambda trong C / C ++

Hàm Lambda - Các hàm Lambda are là một hàm nội tuyến không yêu cầu bất kỳ triển khai nào bên ngoài phạm vi của chương trình chính.

Các hàm Lambda cũng có thể được sử dụng như một giá trị của biến để lưu trữ. Lambda có thể được coi là một đối tượng có thể được gọi bởi hàm (được gọi là functors ).

Bất cứ khi nào trình biên dịch gặp định nghĩa của hàm lambda, nó thường tạo một đối tượng tùy chỉnh cho lambda.

Một hàm lambda có nhiều chức năng hơn một hàm bình thường, chẳng hạn, nó có một phương thức bắt để nắm bắt các biến được sử dụng. Tuy nhiên, biến được capture được coi là thành viên của đối tượng.

Đôi khi một hàm lambda còn được gọi là “đối tượng hàm” có phạm vi riêng và có thể được truyền dưới dạng tham số bên trong một hàm bình thường. Hàm Lambda có thời gian tồn tại của riêng nó.

[] - Chụp

() - Thông số (Tùy chọn)

- Giá trị trả lại (Tùy chọn)

{...} - Cơ quan chức năng.

Cú pháp lambda

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

Chụp - Chụp là một mệnh đề mà qua đó hàm lambda đã cấp quyền truy cập vào các biến có sẵn trong phạm vi cụ thể hoặc khối lồng nhau đó.

Chúng tôi có thể nắm bắt giá trị của một biến có sẵn bằng cách sử dụng hai phương pháp,

  • Chụp đối tượng theo tên - Việc nắm bắt đối tượng theo tên tạo một bản sao cục bộ của hàm lambda.

Chúng ta có thể hiểu khái niệm này với ví dụ sau -

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;
   }
}

Trong ví dụ trên, giá trị được ghi lại bằng cách tạo bản sao cục bộ của hàm lambda.

  • Chụp đối tượng bằng cách tham chiếu - Chụp một đối tượng bằng tham chiếu thao tác ngữ cảnh của hàm lambda. Do đó, giá trị được đối tượng hàm hoặc hàm lambda ghi lại có thể được thay đổi.

Chúng ta có thể hiểu điều này với ví dụ sau -

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 Bên trong hàm thành viên

Chúng ta biết rằng một hàm lambda có thể được sử dụng như một tham số bên trong bất kỳ hàm bình thường nào. Ví dụ:

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;
};