سلام به کاربران روکسو، در این مقالهی آموزشی به عبارت 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) استفادهشده برای ثبت متغیرها:
یک 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
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.