كورس C++ المتقدم – الحلقة الرابعة: Lambda Functions (الدوال المجهولة)
#برمجة
مقدمة
مرحباً بك في الحلقة الرابعة من المستوى المتقدم في C++.
في الحلقات السابقة تعلمنا:
- Templates
- Exception Handling
- Smart Pointers
واليوم سندخل إلى أسلوب حديث جداً في C++:
Lambda Functions
وهي دوال:
- بدون اسم
- تُكتب في نفس المكان الذي تُستخدم فيه
- قوية جداً مع STL
ما هي Lambda؟
بدلاً من كتابة دالة كاملة:
int add(int a, int b)
{
return a + b;
}
يمكنك كتابتها مباشرة داخل السطر.
الشكل العام
[capture](parameters) -> return_type
{
// body
}
مثال بسيط جداً
#include <iostream>
using namespace std;
int main()
{
auto sum = [](int a, int b)
{
return a + b;
};
cout << sum(10, 20);
return 0;
}
الناتج
30
شرح Lambda
[] → capture (سنشرحها لاحقاً)
(int a, int b) → parameters
{ return a + b; } → body
Lambda بدون متغير
[](int x, int y)
{
cout << x + y;
}(5, 7);
الناتج
12
استخدام Lambda مع STL
مثال مهم جداً
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> v = {5, 2, 9, 1, 7};
sort(v.begin(), v.end(),
[](int a, int b)
{
return a < b;
});
for(int x : v)
cout << x << " ";
return 0;
}
الناتج
1 2 5 7 9
Lambda مع for_each
for_each(v.begin(), v.end(),
[](int x)
{
cout << x << endl;
});
ما هو Capture؟
Capture يعني:
كيف تستخدم متغيرات خارج Lambda داخلها
مثال
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int b = 20;
auto sum = [a, b]()
{
return a + b;
};
cout << sum();
return 0;
}
الناتج
30
أنواع Capture
1) Capture بالقيمة
[a, b]
2) Capture بالإشارة
[&a, &b]
مثال
#include <iostream>
using namespace std;
int main()
{
int x = 10;
auto f = [&x]()
{
x += 5;
};
f();
cout << x;
return 0;
}
الناتج
15
Capture الكل
بالقيمة
[=]
بالإشارة
[&]
مثال مهم
#include <iostream>
using namespace std;
int main()
{
int a = 5;
int b = 10;
auto f = [=]()
{
cout << a + b;
};
f();
return 0;
}
Lambda مع return type
auto divide = [](int a, int b) -> double
{
return (double)a / b;
};
مثال كامل
#include <iostream>
using namespace std;
int main()
{
auto divide = [](int a, int b) -> double
{
return (double)a / b;
};
cout << divide(10, 3);
return 0;
}
الناتج
3.33333
استخدام Lambda في المشاريع
Lambda تُستخدم في:
- الترتيب
- البحث
- الفلاتر
- الذكاء الاصطناعي
- الألعاب
- معالجة البيانات
مثال: فلترة أرقام
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v = {1,2,3,4,5,6,7,8};
for_each(v.begin(), v.end(),
[](int x)
{
if(x % 2 == 0)
cout << x << " ";
});
return 0;
}
الناتج
2 4 6 8
Lambda داخل متغير
auto square = [](int x)
{
return x * x;
};
مثال
cout << square(6);
الناتج
36
مقارنة بين Function و Lambda
| Function | Lambda |
|---|---|
| لها اسم | بدون اسم |
| خارج main | داخل أي مكان |
| تقليدية | حديثة |
| أقل مرونة | أكثر مرونة |
أخطاء شائعة
❌ نسيان الأقواس ()
❌ استخدام متغير بدون capture
❌ خلط = و &
تمرين 1
اكتب Lambda تجمع رقمين.
تمرين 2
استخدم Lambda لترتيب مصفوفة تنازلياً.
تمرين 3
استخدم for_each لطباعة الأرقام الزوجية فقط.
تمرين 4
اكتب Lambda تضرب رقم في نفسه.
تمرين 5
استخدم Lambda مع vector لحساب مجموع العناصر.
ملخص الحلقة الرابعة
تعلمنا:
- Lambda Functions
- capture []
- capture بالقيمة والإشارة
- for_each
- sort مع lambda
- كتابة دوال بدون اسم
- استخدام STL بشكل احترافي
في الحلقة الخامسة سنتعلم:
🔥 Multithreading (التنفيذ المتعدد)
وسنتعرف على:
- تشغيل أكثر من مهمة في نفس الوقت
- تحسين أداء البرامج
- Thread
- join و detach
- تطبيقات الألعاب والأنظمة الكبيرة 🚀

تعليقات
إرسال تعليق