عبارات لامبدا
عبارات لامبدا در سیپلاسپلاس توابع ناشناس یا بینام هستند که امکان تعریف بلوکهای کد را در محل استفاده فراهم میکنند. معرفی این قابلیت از استاندارد C++11 به برنامهنویسان اجازه داد تا عملیات پیچیده بر روی دادهها، تعامل با الگوریتمهای STL و پیادهسازی منطق تابعی در برنامههای شیءگرا را با کد کوتاه و خوانا انجام دهند. این عبارات میتوانند متغیرهای محیطی را با ارزش یا ارجاع دریافت کنند که کنترل دقیقی بر قابلیت تغییر و مدیریت حافظه ارائه میدهد.
استفاده از عبارات لامبدا در پردازش کانتینرها، فیلتر دادهها، اعمال تبدیل و بهبود الگوریتمها کاربرد ویژهای دارد. آنها به صورت مستقیم با مفاهیم پایه سیپلاسپلاس شامل سینتکس، ساختار دادهها، الگوریتمها و اصول OOP در ارتباط هستند.
در این آموزش، شما یاد خواهید گرفت چگونه عبارات لامبدا را در پروژههای واقعی سیپلاسپلاس ایجاد و اعمال کنید، از آنها برای پردازش دادهها، بهینهسازی محاسبات و تعامل با کد شیءگرا استفاده کنید. همچنین بهترین شیوهها و خطاهای رایج مانند نشت حافظه، مدیریت نادرست ارجاعات و الگوریتمهای ناکارآمد بررسی خواهد شد تا کدی امن، بهینه و قابل نگهداری تولید شود.
مثال پایه
text\#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\#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.
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود