در حال بارگذاری...

عبارات لامبدا

عبارات لامبدا در سی‌پلاس‌پلاس توابع ناشناس یا بی‌نام هستند که امکان تعریف بلوک‌های کد را در محل استفاده فراهم می‌کنند. معرفی این قابلیت از استاندارد C++11 به برنامه‌نویسان اجازه داد تا عملیات پیچیده بر روی داده‌ها، تعامل با الگوریتم‌های STL و پیاده‌سازی منطق تابعی در برنامه‌های شیءگرا را با کد کوتاه و خوانا انجام دهند. این عبارات می‌توانند متغیرهای محیطی را با ارزش یا ارجاع دریافت کنند که کنترل دقیقی بر قابلیت تغییر و مدیریت حافظه ارائه می‌دهد.
استفاده از عبارات لامبدا در پردازش کانتینرها، فیلتر داده‌ها، اعمال تبدیل و بهبود الگوریتم‌ها کاربرد ویژه‌ای دارد. آنها به صورت مستقیم با مفاهیم پایه سی‌پلاس‌پلاس شامل سینتکس، ساختار داده‌ها، الگوریتم‌ها و اصول OOP در ارتباط هستند.
در این آموزش، شما یاد خواهید گرفت چگونه عبارات لامبدا را در پروژه‌های واقعی سی‌پلاس‌پلاس ایجاد و اعمال کنید، از آن‌ها برای پردازش داده‌ها، بهینه‌سازی محاسبات و تعامل با کد شیءگرا استفاده کنید. همچنین بهترین شیوه‌ها و خطاهای رایج مانند نشت حافظه، مدیریت نادرست ارجاعات و الگوریتم‌های ناکارآمد بررسی خواهد شد تا کدی امن، بهینه و قابل نگهداری تولید شود.

مثال پایه

text
TEXT Code
\#include <iostream>
\#include <vector>
\#include <algorithm>

int main() {
std::vector<int> اعداد = {1, 2, 3, 4, 5};

// لامبدا برای چاپ عناصر
auto چاپ = [](int n) { std::cout << n << " "; };

std::cout << "اعداد اصلی: ";
std::for_each(اعداد.begin(), اعداد.end(), چاپ);
std::cout << std::endl;

// لامبدا برای دو برابر کردن مقادیر
std::for_each(اعداد.begin(), اعداد.end(), [](int &n) { n *= 2; });

std::cout << "اعداد دو برابر شده: ";
std::for_each(اعداد.begin(), اعداد.end(), چاپ);
std::cout << std::endl;

return 0;

}

در این مثال، یک بردار از اعداد صحیح تعریف شده و از عبارات لامبدا برای پردازش عناصر استفاده شده است. اولین لامبدا auto چاپ = [](int n) { std::cout << n << " "; }; متغیرهای خارجی را دریافت نمی‌کند و تنها هر عنصر را چاپ می‌کند. این لامبدا به std::for_each منتقل می‌شود تا بر روی همه عناصر بردار اجرا شود.
لامبدای دوم [](int &n) { n *= 2; } عناصر را با ارجاع دریافت می‌کند و مقادیر بردار را مستقیماً تغییر می‌دهد. این مثال نشان می‌دهد چگونه عبارات لامبدا می‌توانند برای پردازش داده‌ها و حفظ کد کوتاه و خوانا در پروژه‌های واقعی کاربرد داشته باشند.

مثال کاربردی

text
TEXT Code
\#include <iostream>
\#include <vector>
\#include <algorithm>
\#include <numeric>

class پردازشگرداده {
public:
void پردازش() {
std::vector<int> داده‌ها = {3, 7, 2, 9, 5};

// لامبدا برای فیلتر مقادیر
int حد = 5;
std::vector<int> فیلترشده;
std::copy_if(داده‌ها.begin(), داده‌ها.end(), std::back_inserter(فیلترشده),
[حد](int n) { return n > حد; });

// لامبدا برای جمع کردن مقادیر فیلترشده
int جمع = std::accumulate(فیلترشده.begin(), فیلترشده.end(), 0,
[](int acc, int n) { return acc + n; });

std::cout << "جمع عناصر بزرگتر از 5: " << جمع << std::endl;

// لامبدا با this برای فراخوانی متد کلاس
std::for_each(فیلترشده.begin(), فیلترشده.end(),
[this](int n) { نمایشنتیجه(n); });
}

private:
void نمایشنتیجه(int مقدار) {
std::cout << "مقدار پردازش شده: " << مقدار << std::endl;
}
};

int main() {
پردازشگرداده pd;
pd.پردازش();
return 0;
}

در این مثال پیشرفته، استفاده از عبارات لامبدا برای فیلتر کردن داده‌ها، جمع کردن مقادیر و فراخوانی متدهای کلاس نشان داده شده است. [حد](int n) { return n > حد; } متغیر حد را به صورت مقدار دریافت می‌کند و [](int acc, int n) { return acc + n; } برای جمع کردن عناصر در std::accumulate استفاده می‌شود. لامبدا [this](int n) { نمایشنتیجه(n); } امکان دسترسی به اعضای کلاس را فراهم می‌کند.
استفاده صحیح از captureها همراه با الگوریتم‌های STL و مفاهیم OOP، امنیت، خوانایی و بهینه‌سازی کد را تضمین می‌کند و در پروژه‌های پیچیده سی‌پلاس‌پلاس اهمیت ویژه‌ای دارد.

بهترین شیوه‌ها شامل انتخاب صحیح capture به صورت مقدار یا ارجاع، کمینه کردن متغیرهای capture شده و استفاده محتاطانه از mutable است. خطاهای رایج شامل capture کردن اشاره‌گرهای محلی خارج از محدوده و استفاده نادرست از mutable می‌باشد.
برای بهینه‌سازی، استفاده از لامبدا در الگوریتم‌های STL، جلوگیری از کپی‌های غیرضروری و بهره‌گیری از move semantics توصیه می‌شود. از نظر امنیت، انتخاب متغیرهای capture شده باید با دقت انجام شود، به ویژه در محیط‌های چندنخی.

📊 جدول مرجع

سی‌پلاس‌پلاس Element/Concept Description Usage Example
لیست capture متغیرهای قابل دسترس در لامبدا \[x, \&y]\(int n){ return n+x+y; }
لیست پارامترها تعریف پارامترهای لامبدا (int a, int b){ return a+b; }
نوع بازگشتی اختیاری، می‌توان مشخص کرد \[]\(int n) -> double { return n*1.5; }
mutable اجازه تغییر متغیرهای capture شده به صورت مقدار [x]() mutable { x += 10; }
لامبدا عمومی استفاده از auto برای پارامترها \[]\(auto a, auto b){ return a+b; }
capture this دسترسی به اعضای کلاس [this](){ this->متد(); }

عبارات لامبدا امکان نوشتن کد سی‌پلاس‌پلاس کوتاه، مدولار و انعطاف‌پذیر را فراهم می‌کنند. نکات کلیدی شامل درک مکانیزم capture، ادغام با STL و OOP، بهینه‌سازی عملکرد و امنیت کد است.
گام‌های بعدی شامل یادگیری لامبداهای عمومی، بازگشتی، استفاده در چندنخی و ادغام با الگوهای طراحی مانند Strategy، Observer و Command است تا پروژه‌هایی مقیاس‌پذیر و قابل نگهداری توسعه یابند.

🧠 دانش خود را بیازمایید

آماده شروع

Test Your Knowledge

Test your understanding of this topic with practical questions.

4
سوالات
🎯
70%
برای قبولی
♾️
زمان
🔄
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود