خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

راهنمای سریع عبارات لامبدا در C++

بیاموزید که چگونه لامبدا می تواند کد شما را کارآمدتر و نگهداری آسان تر کند.

زبان های برنامه نویسی به طور مداوم در حال تکامل هستند، حتی آنهایی مانند C++ که مدت ها پیش خود را تثبیت کردند. آنها توابعی را به کتابخانه های استاندارد اضافه می کنند و تغییرات دیگری را برای سهولت کار برنامه نویسانی که در یک زمینه پویا کار می کنند ایجاد می کنند.

به عنوان بخشی از به‌روزرسانی‌های حاصل از تکامل زبان، C++ در نسخه 2011 خود، پشتیبانی از عبارت‌های لامبدا را اضافه کرد.

یک عبارت لامبدا دقیقاً چیست و چگونه می توانید از آن به عنوان یک برنامه نویس ++C به نفع خود استفاده کنید؟

بیان لامبدا چیست؟

یک عبارت لامبدا به عنوان تابع لامبدا نیز شناخته می شود. این یک عبارت درون خطی با توانایی پذیرش آرگومان ها، انجام عملیات و برگرداندن یک مقدار است، درست مانند یک تابع معمولی.

می توانید از یک لامبدا در داخل تابع دیگری استفاده کنید و آن را به یک متغیر اختصاص دهید. توابع Lamba روشی عملی برای تعریف یک شیء تابع ناشناس در یک برنامه هستند. تقریباً هر زبانی از لامبدا پشتیبانی می‌کند، اگرچه هر پیاده‌سازی با بقیه متفاوت است.

اجزای یک عبارت C++ Lambda چیست؟

استفاده از عبارات لامبدا در C++ آسان است. می توانید سینتکس یک عبارت لامبدا را در C++ به صورت زیر تجزیه کنید:

[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 را خودکار اعلام می کند زیرا عبارت lambda می تواند هر نوع داده ای را بپذیرد و برگرداند. این امر تعیین نوع آن را در حین کامپایل به عهده کامپایلر می گذارد.

از کد بالا، می بینید که یک عبارت لامبدا شامل چندین بخش است که نحوه عملکرد آن را مشخص می کند. در اینجا یک مرور سریع از هر یک از این مؤلفه ها ارائه شده است.

  1. عبارت Capture: این اولین قسمت از عبارت lambda است که در آن می توانید متغیرهای از قبل موجود را مشخص کنید یا متغیرهای جدیدی را برای استفاده در بدنه عبارت تعریف کنید. راه‌های مختلفی برای تعیین عکس‌ها وجود دارد، برای مثال: auto addTwo = [foo](){ return foo + 2; }; // توسط valueauto addThree = [&bar](){ return bar + 3; }; // توسط referenceauto addAllVal = [=](){ return foo + bar; }; // all by valueauto addAllRef = [&](){ return foo + bar; }; // همه با مرجع // ایجاد یک متغیر در capture clauseauto createVarInCapture = [fooBar = foo + bar](){ return fooBar * 5; }; // no capture – خطا را برمی گرداند زیرا foo قابل دسترسی نیستauto errorExpression = [](){ return foo + 2; };
  2. پارامترها: این قسمت از عبارت لامبدا نیز اختیاری است. این شامل پارامترهای تابع مورد نیاز لامبدا است. این هیچ تفاوتی با روش معمول تعریف پارامترهای تابع در C++ ندارد.
  3. گزینه ها: همچنین می توانید هنگام تعریف عبارت lambda گزینه هایی را مشخص کنید. برخی از گزینه‌هایی که می‌توانید استفاده کنید عبارتند از: قابل تغییر، استثنا (مثلاً noexcept در اولین کد نمونه)، -> return_type (به عنوان مثال ->int)، نیازمندی‌ها، ویژگی‌ها، و غیره. گزینه mutable اغلب استفاده می‌شود، زیرا اجازه می‌دهد عکس‌ها در داخل قابل تغییر باشند. لامبدا کد زیر مقدار this.int = 10 را نشان می دهد. // یک خطا را برمی گرداند – مقدار یک const در داخل expressauto decrement = [value](){ return –value; };auto increment = [value]() mutable { return ++value; };increment(); // 11 اگرچه گزینه های دیگر به ندرت مورد استفاده قرار می گیرند، می توانید اطلاعات بیشتری در مورد آنها در صفحه cppreference.com در lambdas دریافت کنید.
  4. بدنه عبارت: این بدنه عبارت لامبدا است که یک مقدار را اجرا می کند و برمی گرداند، بسیار شبیه به یک تابع. در صورت لزوم، می توانید بدنه یک عبارت لامبدا را در بیش از یک خط تقسیم کنید. با این حال، بهترین روش این است که آن را تا حد امکان مختصر نگه دارید تا از کد ناسازگار جلوگیری شود.
مطلب مرتبط:   چگونه الگوهای پیش‌فرض را در جنگو-آلاوت لغو کنیم

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

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

مزایای عبارات لامبدا چیست؟

مزایای زیادی برای استفاده از توابع لامبدا در کد شما وجود دارد. جدای از افزایش سرعت و کارایی توسعه، بهترین مزایایی که از لامبدا دریافت می کنید به شرح زیر است:

  • عبارات لامبدا به تمیز نگه داشتن کد کمک می کند. یکی از بهترین راه‌ها برای ساده و منظم نگه داشتن کد، استفاده از لامبدا در صورت امکان است. این می تواند برای حفظ ساختار کد قابل خواندن و قابل استفاده مجدد بسیار مفید باشد.
  • شما می توانید لامبدا را به عنوان پارامتر به سایر توابع ارسال کنید. متد ()std::sort کتابخانه استاندارد C++ از این مزیت استفاده می‌کند. شما می توانید یک لامبدا را به عنوان یکی از پارامترهای این روش ارسال کنید تا مشخص کنید تابع چگونه باید مرتب سازی را انجام دهد. به عنوان مثال: std::vector arr = {2, 5, 1, 3, 4}; std:: sort(arr.begin()، arr.end()، [](int a, int b){ return a
  • لامبداها قابل استفاده مجدد هستند. گاهی اوقات، ممکن است بخواهید یک بلوک از کد قابل استفاده مجدد در محدوده یک تابع در برنامه خود بدون نیاز به تعریف یک تابع جدید ایجاد کنید. لامبدا در چنین مواردی می تواند بسیار مفید باشد. مثال زیر را از عبارت لامبدا قابل استفاده مجدد در نظر بگیرید:#include using namespace std; int main() { // تعریف یک لامبدا قابل استفاده مجدد افزودن خودکار = [](خودکار a، b خودکار، c خودکار) noexcept { cout << "اکنون در حال جمع کردن... " << a << ", " << b << " و " << c << endl; برگرداندن a + b + c ; }; cout << addUp(22, 33, 44) << endl; cout << addUp(string("Happy"), string("Tirth"), string("day")) << endl; cout << addUp(true, false, true) << std::endl; // به صورت اعداد (1 و 0) اجرا می شود} این برنامه نتیجه زیر را ایجاد می کند: این مثال نشان می دهد که چقدر ساده است که یک لامبدا را تعریف کنید تا بتوانید از آن با هر نوع استفاده کنید.

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}

#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)
}

خروجی کدی که یک لامبدا قابل استفاده مجدد را نشان می دهد

استفاده از Lambdas در C++

بسیاری از مزایای دیگری که عبارات لامبدا ارائه می دهند وجود دارد، و با پیچیده تر شدن ساختار برنامه شما آنها را کشف خواهید کرد. در واقع، برنامه نویسان ++C گاهی اوقات به عبارات لامبدا به عنوان بسته اشاره می کنند، زیرا آنها راه بسیار خوبی برای پیاده سازی بسته شدن در کد هستند.

اگر می خواهید مفاهیم C++ مدرن را در پایگاه کد خود بگنجانید، باید عبارات لامبدا را در نظر بگیرید.