लोड हो रहा है...

Lambda एक्सप्रेशन्स

C++ में Lambda एक्सप्रेशन्स (अज्ञात फ़ंक्शन) आधुनिक C++ प्रोग्रामिंग का एक महत्वपूर्ण हिस्सा हैं। इन्हें C++11 में पेश किया गया था ताकि डेवलपर्स फ़ंक्शनल प्रोग्रामिंग की तरह लचीले, छोटे और इंट्रिन्सिक फ़ंक्शन कोड को सीधे उस जगह पर परिभाषित कर सकें जहां उनकी आवश्यकता हो। Lambda एक्सप्रेशन्स का उपयोग विशेष रूप से STL एल्गोरिदम, कस्टम कॉलबैक, और डेटा प्रोसेसिंग में किया जाता है, जिससे कोड अधिक मॉड्यूलर, पठनीय और सुरक्षित बनता है।
Lambda एक्सप्रेशन्स वेरिएबल्स को कैप्चर करने की क्षमता प्रदान करते हैं, जो उन्हें या तो मूल्य के द्वारा (by value) या संदर्भ (by reference) के द्वारा पकड़ने की अनुमति देती है। यह नियंत्रण प्रोग्रामर को मेमोरी कुशल और सुरक्षित कोड लिखने में मदद करता है। C++ प्रोजेक्ट्स में Lambda का उपयोग डेटा स्ट्रक्चर, एल्गोरिदम, और ऑब्जेक्ट-ओरिएंटेड प्रिंसिपल्स के साथ मिलकर किया जा सकता है।
इस ट्यूटोरियल में आप सीखेंगे कि कैसे Lambda एक्सप्रेशन्स का उपयोग करके STL कंटेनर्स को प्रोसेस करना, एल्गोरिदमिक ऑप्टिमाइजेशन करना, और OOP में प्रैक्टिकल अप्लिकेशन बनाना है। साथ ही यह दिखाया जाएगा कि Lambda का उपयोग करते समय स्मृति प्रबंधन, एरर हैंडलिंग और प्रदर्शन सुधार के लिए क्या Best Practices अपनाई जाती हैं।

मूल उदाहरण

text
TEXT Code
\#include <iostream>
\#include <vector>
\#include <algorithm>

int main() {
std::vector<int> संख्याएँ = {1, 2, 3, 4, 5};

// Lambda द्वारा तत्वों को प्रिंट करना
auto प्रिंट = [](int n) { std::cout << n << " "; };

std::cout << "मूल डेटा: ";
std::for_each(संख्याएँ.begin(), संख्याएँ.end(), प्रिंट);
std::cout << std::endl;

// Lambda द्वारा तत्वों को दोगुना करना
std::for_each(संख्याएँ.begin(), संख्याएँ.end(), [](int &n) { n *= 2; });

std::cout << "दोगुना डेटा: ";
std::for_each(संख्याएँ.begin(), संख्याएँ.end(), प्रिंट);
std::cout << std::endl;

return 0;

}

इस उदाहरण में हम एक integer वेक्टर बनाते हैं और Lambda एक्सप्रेशन्स का उपयोग करके उसे प्रोसेस करते हैं। पहला Lambda auto प्रिंट = [](int n) { std::cout << n << " "; }; किसी भी बाहरी वेरिएबल्स को कैप्चर नहीं करता और केवल प्रत्येक तत्व को प्रिंट करता है। इसे std::for_each के साथ प्रयोग किया गया है।
दूसरा Lambda [](int &n) { n *= 2; } प्रत्येक तत्व को संदर्भ द्वारा पकड़ता है, जिससे मूल वेक्टर में परिवर्तन किया जा सकता है। यह दिखाता है कि Lambda का उपयोग पढ़ने और लिखने दोनों के लिए किया जा सकता है। इस तरह के Lambda एक्सप्रेशन्स को STL एल्गोरिदम के साथ मिलाकर प्रयोग करने से कोड साफ, सुरक्षित और मॉड्यूलर बनता है।

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

text
TEXT Code
\#include <iostream>
\#include <vector>
\#include <algorithm>
\#include <numeric>

class डेटा_प्रोसेसर {
public:
void प्रोसेस() {
std::vector<int> डेटा = {3, 7, 2, 9, 5};

// Lambda द्वारा मूल्य फ़िल्टर करना
int थ्रेशोल्ड = 5;
std::vector<int> फ़िल्टर;
std::copy_if(डेटा.begin(), डेटा.end(), std::back_inserter(फ़िल्टर),
[थ्रेशोल्ड](int n) { return n > थ्रेशोल्ड; });

// Lambda द्वारा फ़िल्टर किए गए तत्वों का योग
int योग = std::accumulate(फ़िल्टर.begin(), फ़िल्टर.end(), 0,
[](int acc, int n) { return acc + n; });

std::cout << "5 से बड़े तत्वों का योग: " << योग << std::endl;

// this कैप्चर के साथ क्लास में Lambda
std::for_each(फ़िल्टर.begin(), फ़िल्टर.end(),
[this](int n) { परिणाम_दिखाएँ(n); });
}

private:
void परिणाम_दिखाएँ(int मान) {
std::cout << "प्रोसेस किया गया मान: " << मान << std::endl;
}
};

int main() {
डेटा_प्रोसेसर प्रोसेसर;
प्रोसेसर.प्रोसेस();
return 0;
}

इस उदाहरण में Lambda एक्सप्रेशन्स का उपयोग फ़िल्टरिंग, योग गणना और क्लास मेथड कॉल में किया गया है। [थ्रेशोल्ड](int n) { return n > थ्रेशोल्ड; } स्थानीय वेरिएबल कैप्चर करता है। [](int acc, int n) { return acc + n; } std::accumulate में योग के लिए है। [this](int n) { परिणाम_दिखाएँ(n); } क्लास सदस्य फ़ंक्शन को कॉल करता है।
सही कैप्चर का चयन, STL एल्गोरिदम का उपयोग और प्रदर्शन के अनुकूल Lambda का निर्माण Advanced C++ प्रोजेक्ट्स में महत्वपूर्ण है।

Lambda एक्सप्रेशन्स के लिए Best Practices में वैल्यू और रेफरेंस कैप्चर का उचित उपयोग, अनावश्यक वेरिएबल्स को कैप्चर न करना और mutable का समझदारी से उपयोग शामिल हैं। सामान्य गलतियाँ हैं: स्थानीय पॉइंटर्स को कैप्चर करना, जो स्कोप से बाहर हो सकते हैं, और mutable का गलत उपयोग।
Performance सुधार के लिए Lambdas को STL एल्गोरिदम के भीतर इनलाइन करें, बड़ी वस्तुओं की अनावश्यक कॉपी से बचें, और move semantics का उपयोग करें। सुरक्षा के लिए कैप्चर की सावधानी बरतें और मल्टी-थ्रेडेड पर्यावरण में सिंक्रोनाइजेशन का ध्यान रखें।

📊 संदर्भ तालिका

C++ Element/Concept Description Usage Example
कैप्चर सूची Lambda में वेरिएबल्स को कैप्चर करना \[x, \&y]\(int n){ return n+x+y; }
पैरामीटर सूची Lambda के पैरामीटर को परिभाषित करना (int a, int b){ return a+b; }
रिटर्न टाइप वैकल्पिक, रिटर्न टाइप निर्दिष्ट करना \[]\(int n) -> double { return n*1.5; }
mutable वैल्यू कैप्चर को संशोधित करने की अनुमति [x]() mutable { x += 10; }
जनरिक Lambda किसी भी टाइप के लिए auto उपयोग \[]\(auto a, auto b){ return a+b; }
this-कैप्चर क्लास सदस्यों तक पहुंच के लिए [this](){ this->मेथड(); }

Lambda एक्सप्रेशन्स से C++ में संक्षिप्त, लचीला और मॉड्यूलर कोड लिखा जा सकता है। मुख्य बिंदु हैं कैप्चर मेकनिज़्म की समझ, STL एल्गोरिदम में उपयोग, OOP में इंटिग्रेशन, प्रदर्शन और सुरक्षा।
अगले कदम में जनरिक Lambda, उच्च-स्तरीय फ़ंक्शन्स, recursive Lambda और मल्टी-थ्रेडिंग में उनका उपयोग शामिल हैं। डिज़ाइन पैटर्न जैसे Strategy, Observer, Command में Lambda का प्रयोग प्रोजेक्ट्स की मॉड्यूलैरिटी बढ़ाता है।

🧠 अपने ज्ञान की परीक्षा करें

शुरू करने के लिए तैयार

Test Your Knowledge

Test your understanding of this topic with practical questions.

4
प्रश्न
🎯
70%
पास करने के लिए
♾️
समय
🔄
प्रयास

📝 निर्देश

  • हर प्रश्न को ध्यान से पढ़ें
  • हर प्रश्न के लिए सबसे अच्छा उत्तर चुनें
  • आप जितनी बार चाहें क्विज़ दोबारा दे सकते हैं
  • आपकी प्रगति शीर्ष पर दिखाई जाएगी