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

C++ में लैम्ब्डा एक्सप्रेशन

C++ STL में उपयोगी जेनेरिक फ़ंक्शन्स जैसे std::for_each शामिल हैं। दुर्भाग्य से उनका उपयोग करना काफी बोझिल हो सकता है, विशेष रूप से यदि आप जिस फंक्टर को लागू करना चाहते हैं वह विशेष फ़ंक्शन के लिए यूनिक है। इसलिए वह फ़ंक्शन जिसे आप बनाएंगे वह उस नेमस्पेस में केवल उस एक स्थान पर उपयोग होने के लिए होगा। इस समस्या का समाधान अनाम फ़ंक्शन्स का उपयोग करना है।

C++11 में लैम्ब्डा एक्सप्रेशन्स पेश किए गए हैं ताकि अनाम फ़ंक्शन बनाए जा सकें। उदाहरण के लिए:

उदाहरण

#include <iostream>
#include <vector>
#include <algorithm> // for_each के लिए
using namespace std;

int main() {
    vector<int> myvector;
    myvector.push_back(1);
    myvector.push_back(2);
    myvector.push_back(3);
    
    for_each(myvector.begin(), myvector.end(), [](int x) {
        cout << x * x << endl;
    });
}

आउटपुट

1
4
9

लैम्ब्डा सिंटैक्स

[कैप्चर-क्लॉज] (पैरामीटर्स) -> रिटर्न-टाइप { बॉडी }
  • [कैप्चर-क्लॉज] - बाहरी वेरिएबल्स को कैप्चर कैसे करें
  • (पैरामीटर्स) - फ़ंक्शन पैरामीटर्स (वैकल्पिक यदि खाली)
  • -> रिटर्न-टाइप - रिटर्न टाइप (वैकल्पिक यदि डिड्यूसिबल)
  • { बॉडी } - फ़ंक्शन बॉडी

कैप्चर क्लॉज के प्रकार

कैप्चर अर्थ
[] कुछ भी कैप्चर न करें
[=] सभी बाहरी वेरिएबल्स को वैल्यू द्वारा कैप्चर करें
[&] सभी बाहरी वेरिएबल्स को रेफरेंस द्वारा कैप्चर करें
[x, &y] x को वैल्यू द्वारा, y को रेफरेंस द्वारा कैप्चर करें
[this] this पॉइंटर कैप्चर करें (मेंबर एक्सेस के लिए)

उदाहरण: विभिन्न कैप्चर

int x = 10, y = 20;

// वैल्यू द्वारा कैप्चर
auto lambda1 = [x]() { cout << x; }; // x = 10

// रेफरेंस द्वारा कैप्चर
auto lambda2 = [&x]() { x = 30; }; // x को मॉडिफाई करता है

// मिश्रित
auto lambda3 = [=, &y]() { y = 40; }; // x वैल्यू द्वारा, y रेफरेंस द्वारा

// जनरलाइज्ड लैंब्डा कैप्चर (C++14)
auto lambda4 = [z = x + y]() { cout << z; }; // z = 30

व्यावहारिक उदाहरण

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    // फ़िल्टर: केवल इवन नंबर्स
    vector evens;
    copy_if(v.begin(), v.end(), back_inserter(evens), 
            [](int x) { return x % 2 == 0; });
    
    // ट्रांसफॉर्म: वर्ग करें
    vector squares;
    transform(v.begin(), v.end(), back_inserter(squares),
              [](int x) { return x * x; });
    
    // सॉर्ट कस्टम कम्पेरेटर के साथ
    sort(v.begin(), v.end(), [](int a, int b) { return a > b; }); // डिसेंडिंग
    
    // एक्यूमुलेट लैंब्डा के साथ
    int sum = accumulate(v.begin(), v.end(), 0, 
                         [](int a, int b) { return a + b; });
    
    return 0;
}

म्यूटेबल लैम्ब्डा

// डिफ़ॉल्ट रूप से लैम्ब्डा const होता है
auto lambda = [x]() { x = 20; }; // एरर! x const है

// mutable कीवर्ड जोड़ें
auto lambda2 = [x]() mutable { x = 20; cout << x; }; // OK, लेकिन x कॉपी है
  1. C++ में लाइन रिफ्लेक्शन - Y-अक्ष के समानांतर सममित रेखा जांचें C++ में लाइन रिफ्लेक्शन - Y-अक्ष के समानांतर सममित रेखा जांचें

    समस्या विवरण मान लीजिए हमारे पास 2D तल पर n बिंदु हैं, हमें जांचना है कि क्या y-अक्ष के समानांतर कोई रेखा है जो दिए गए बिंदुओं को सममित रूप से प्रतिबिंबित करती है, दूसरे शब्दों में, जांचें कि क्या कोई ऐसी रेखा मौजूद है जो सभी बिंदुओं को दी गई रेखा पर प्रतिबिंबित करने के बाद मूल बिंदुओं का समुच्चय प

  1. C++ में डायगोनल ट्रैवर्स II C++ में डायगोनल ट्रैवर्स II

    मान लीजिए हमारे पास nums नामक लिस्ट ऑफ लिस्ट है, हमें nums के सभी एलिमेंट्स को डायगोनल क्रम में दिखाना है।इसलिए, यदि इनपुट हैतो आउटपुट होगा [1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16]इसे हल करने के लिए, हम निम्न चरणों का पालन करेंगे:एक ऐरे ret परिभाषित करेंएक 2D ऐरे v परिभाषित करेंi := 0 से शुरू करें,

  1. - C++11 में लैम्ब्डा एक्सप्रेशन क्या है?

    C++ STL में std::for_each जैसे उपयोगी जेनेरिक फ़ंक्शन्स शामिल हैं। दुर्भाग्य से, उनका उपयोग करना काफी बोझिल हो सकता है, विशेष रूप से यदि आप जिस फंक्टर को लागू करना चाहते हैं वह विशेष फ़ंक्शन के लिए अद्वितीय है। तो यह फ़ंक्शन जो आप बनाएंगे वह उस नेमस्पेस में केवल उस एक स्थान पर उपयोग होने के लिए होग