Lambda در ++C

Lambda in C Plus Plus

11 اردیبهشت 1401
cplusplus-lambda-expressions

سلام به کاربران روکسو، در این مقاله‌ی آموزشی به عبارت‌ Lambda در ++C می‌پردازیم.

در 11++C عبارت lambda معرفی شده است که به ما امکان نوشتن یک تابع توکار را می‌دهد که می‌تواند برای قطعه‌کد‌های کوتاه که قرار نیست دوباره استفاده شوند و ارزش نامگذاری ندارند، استفاده شود. در شکل ساده‌ی خودش، عبارت lambda می‌تواند به این شکل تعریف شود:

[ capture clause ] (parameters) -> return-type  
{   
   definition of method   
}

عموما return-type در عبارت lambda توسط خود کامپایلر ارزیابی می‌شود و نیازی به تعیین آن به صورت صریح نیست و بخش return-type <-  می‌تواند نادیده گرفته شود، اما در برخی موارد پیچیده مانند دستورات شرطی، کامپایلر نمی‌تواند نوع برگشتی را ارزیابی کند و ما باید آن را مشخص کنیم.

استفاده‌های مختلف از عبارت lambda با توابع استاندارد در قطعه‌کد زیر آمده است:

// C++ program to demonstrate lambda expression in C++
#include <bits/stdc++.h>
using namespace std;
 
// Function to print vector
void printVector(vector<int> v)
{
    // lambda expression to print vector
    for_each(v.begin(), v.end(), [](int i)
    {
        std::cout << i << " ";
    });
    cout << endl;
}
 
int main()
{
    vector<int> v {4, 1, 3, 5, 2, 3, 1, 7};
 
    printVector(v);
 
    // below snippet find first number greater than 4
    // find_if searches for an element for which
    // function(third argument) returns true
    vector<int>:: iterator p = find_if(v.begin(), v.end(), [](int i)
    {
        return i > 4;
    });
    cout << "First number greater than 4 is : " << *p << endl;
 
 
    // function to sort vector, lambda expression is for sorting in
    // non-increasing order Compiler can make out return type as
    // bool, but shown here just for explanation
    sort(v.begin(), v.end(), [](const int& a, const int& b) -> bool
    {
        return a > b;
    });
 
    printVector(v);
 
    // function to count numbers greater than or equal to 5
    int count_5 = count_if(v.begin(), v.end(), [](int a)
    {
        return (a >= 5);
    });
    cout << "The number of elements greater than or equal to 5 is : "
         << count_5 << endl;
 
    // function for removing duplicate element (after sorting all
    // duplicate comes together)
    p = unique(v.begin(), v.end(), [](int a, int b)
    {
        return a == b;
    });
 
    // resizing vector to make size equal to total different number
    v.resize(distance(v.begin(), p));
    printVector(v);
 
    // accumulate function accumulate the container on the basis of
    // function provided as third argument
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int f = accumulate(arr, arr + 10, 1, [](int i, int j)
    {
        return i * j;
    });
 
    cout << "Factorial of 10 is : " << f << endl;
 
    //     We can also access function by storing this into variable
    auto square = [](int i)
    {
        return i * i;
    };
 
    cout << "Square of 5 is : " << square(5) << endl;
}

خروجی قطعه‌کُد بالا به این صورت است:

4 1 3 5 2 3 1 7 
First number greater than 4 is : 5
7 5 4 3 3 2 1 1 
The number of elements greater than or equal to 5 is : 2
7 5 4 3 2 1 
Factorial of 10 is : 3628800
Square of 5 is : 25

یک عبارت lambda می‌تواند قدرت بیشتری نسبت به یک تابع معمولی با دسترسی داشتن به متغیر‌ها از محدوده‌ی احاطه‌شده داشته باشد. می‌توان متغیر‌های خارجی را از محدوده‌ی احاطه‌شده به سه روش ثبت کرد:

  • ثبت با مرجع
  • ثبت با مقدار
  • ثبت با هردو (ثبت ترکیبی)

نحو (Syntax) استفاده‌شده برای ثبت متغیر‌ها:

  • [&]: ثبت‌ همه‌ی متغیر‌های خارجی با مرجع
  • [=]:‌ ثبت همه‌ی متغیر‌های خارجی با مقدار
  • [a, &b]: ثبت a با مقدار و b با ارجاع

یک lambda با ثبت‌‌کننده‌ی خالی [ ] می‌تواند تنها به آن متغیر‌هایی که محلی (local) هستند، دسترسی داشته باشد.

راه‌های ثبت‌کردن در قطعه‌کُد زیر آمده است:

// C++ program to demonstrate lambda expression in C++
#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    vector<int> v1 = {3, 1, 7, 9};
    vector<int> v2 = {10, 2, 7, 16, 9};
 
    //  access v1 and v2 by reference
    auto pushinto = [&] (int m)
    {
        v1.push_back(m);
        v2.push_back(m);
    };
 
    // it pushes 20 in both v1 and v2
    pushinto(20);
 
    // access v1 by copy
    [v1]()
    {
        for (auto p = v1.begin(); p != v1.end(); p++)
        {
            cout << *p << " ";
        }
    };
 
    int N = 5;
 
    // below snippet find first number greater than N
    // [N]  denotes,   can access only N by value
    vector<int>:: iterator p = find_if(v1.begin(), v1.end(), [N](int i)
    {
        return i > N;
    });
 
    cout << "First number greater than 5 is : " << *p << endl;
 
    // function to count numbers greater than or equal to N
    // [=] denotes,   can access all variable
    int count_N = count_if(v1.begin(), v1.end(), [=](int a)
    {
        return (a >= N);
    });
 
    cout << "The number of elements greater than or equal to 5 is : "
         << count_N << endl;
}

خروجی قطعه‌کد بالا به این صورت است:

First number greater than 5 is : 7
The number of elements greater than or equal to 5 is : 3

عبارت lambda تنها در نسخه‌های 11++C به بعد کار می‌کند.


منبع: وب سایت geeksforgeeks

نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.