🔥 أحدث الأخبار

موقع يهتم بكل ماهو جديد في عالم التكنولوجيا والرياضة

كورس C++ المتقدم – الحلقة الرابعة: Lambda Functions (الدوال المجهولة)

 

كورس 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
  • تطبيقات الألعاب والأنظمة الكبيرة 🚀

تعليقات

💬 🙋🏻‍♂️