Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C/C++ में लैम्ब्डा फंक्शन का महत्व

लैम्ब्डा फंक्शन (Lambda Function) - लैम्ब्डा एक इनलाइन फंक्शन है जिसे मुख्य प्रोग्राम के स्कोप के बाहर किसी कार्यान्वयन की आवश्यकता नहीं होती।

लैम्ब्डा फंक्शन की विशेषताएं

  • एक वेरिएबल द्वारा मान के रूप में उपयोग किया जा सकता है
  • इसे **फंक्टर (functors)** कहा जाता है - एक ऑब्जेक्ट जिसे फंक्शन की तरह कॉल किया जा सकता है
  • जब भी कंपाइलर लैम्ब्डा फंक्शन की परिभाषा देखता है, यह लैम्ब्डा के लिए एक कस्टम ऑब्जेक्ट बनाता है
  • सामान्य फंक्शन से अधिक कार्यक्षमता: **कैप्चरिंग मैकेनिज्म** होता है जो उपयोग किए गए वेरिएबल्स को कैप्चर करता है
  • कैप्चर किया गया वेरिएबल ऑब्जेक्ट के सदस्य के रूप में माना जाता है
  • "फंक्शन ऑब्जेक्ट" के रूप में संदर्भित किया जा सकता है जिसका अपना स्कोप और लाइफटाइम होता है
  • सामान्य फंक्शन में पैरामीटर के रूप में पास किया जा सकता है

लैम्ब्डा सिंटैक्स (C++11 और बाद में)

[कैप्चर] (पैरामीटर्स) -> रिटर्न_टाइप { फंक्शन_बॉडी };
  • [ ] - कैप्चर क्लॉज
  • ( ) - पैरामीटर्स (वैकल्पिक)
  • -> - रिटर्न टाइप (वैकल्पिक, निगमित किया जा सकता है)
  • {...} - फंक्शन बॉडी

उदाहरण: बुनियादी लैम्ब्डा

auto lambda = [](int a) -> int { return a - 1; };
int result = lambda(5);  // result = 4

कैप्चर मोड्स

1. नाम से कैप्चर (मान द्वारा) - [x]

वेरिएबल की स्थानीय प्रति बनाता है। लैम्ब्डा के अंदर मूल वेरिएबल में परिवर्तन प्रतिबिंबित नहीं होते।

int main() {
    std::set<int> s = {1, 2, 3};
    int i = 20;
    std::for_each(s.begin(), s.end(), [i](int& elem) {
        std::cout << elem * i << std::endl;  // i की कॉपी उपयोग होती है
    });
}

2. संदर्भ द्वारा कैप्चर - [&x]

मूल वेरिएबल को संदर्भित करता है। लैम्ब्डा के अंदर परिवर्तन मूल वेरिएबल को प्रभावित करते हैं।

int main() {
    std::set<int> s = {1, 2, 3};
    int result = 0;
    std::for_each(s.begin(), s.end(), [&result](int& elem) {
        result += elem;  // मूल result संशोधित होता है
    });
    std::cout << result << std::endl;  // 6
}

3. सभी को मान द्वारा कैप्चर - [=]

4. सभी को संदर्भ द्वारा कैप्चर - [&]

5. मिश्रित - [=, &x] या [&, x]

मेंबर फंक्शन के अंदर लैम्ब्डा

class Func {
public:
    Func(std::set<int> s) : s1(s) {}
    
    void func(int level) {
        // 'this' कैप्चर करके मेंबर एक्सेस करें
        auto it = std::remove_if(s1.begin(), s1.end(), 
            [this, level](int i) -> bool { 
                return (i < level); 
            });
        s1.erase(it, s1.end());
    }
private:
    std::set<int> s1;
};

C बनाम C++

  • C++: C++11 से लैम्ब्डा अभिव्यक्तियों का मूल समर्थन
  • C: मूल लैम्ब्डा समर्थन नहीं; फंक्शन पॉइंटर्स और स्टेट स्ट्रक्चर्स का उपयोग करके अनुकरण करें

C में अनुकरण

// C में लैम्ब्डा जैसा व्यवहार
typedef struct {
    int (*func)(int, void*);
    void* context;
} Lambda;

int add_context(int x, void* ctx) {
    int* val = (int*)ctx;
    return x + *val;
}

int main() {
    int captured = 10;
    Lambda lambda = {add_context, &captured};
    printf("%d\n", lambda.func(5, lambda.context));  // 15
    return 0;
}

उपयोग के मामले

  • STL एल्गोरिदम्स (sort, find_if, for_each) के साथ
  • कॉलबैक्स और इवेंट हैंडलर्स
  • लेजी इवैल्यूएशन
  • फंक्शनल प्रोग्रामिंग पैटर्न्स
  1. - C/C++ में putwchar() फंक्शन

    इस लेख में हम C++ STL में putwchar() फंक्शन के कार्य, सिंटैक्स और उदाहरणों पर चर्चा करेंगे। putwchar() क्या है? putwchar() फंक्शन C++ STL में एक इनबिल्ट फंक्शन है, जो हेडर फाइल में परिभाषित है। putwchar() फंक्शन का उपयोग स्टैंडर्ड आउटपुट डिवाइस पर वाइड कैरेक्टर लिखने के लिए किया जाता है। यह फंक्शन

  1. - C/C++ में mbsrtowcs() फंक्शन

    इस लेख में हम C++ STL में std::mbsrtowcs() फंक्शन के कार्य, सिंटैक्स और उदाहरणों पर चर्चा करेंगे। std::mbsrtowcs() क्या है? std::mbsrtowcs() फंक्शन C++ STL में एक इनबिल्ट फंक्शन है, जो हेडर फाइल में परिभाषित है। mbsrtowcs() का अर्थ है कि यह उस नल-टर्मिनेटेड मल्टीबाइट कैरेक्टर स्ट्रिंग को परिवर्तित

  1. C/C++ में System() फंक्शन C/C++ में System() फंक्शन

    दिया गया कार्य C/C++ में system() के कार्य को दिखाना है। system() फंक्शन C/C++ स्टैंडर्ड लाइब्रेरी का एक हिस्सा है। इसका उपयोग उन कमांड्स को पास करने के लिए किया जाता है जिन्हें ऑपरेटिंग सिस्टम के कमांड प्रोसेसर या टर्मिनल में निष्पादित किया जा सकता है, और अंत में कमांड के पूरा होने के बाद लौटाता है