एक सरल generator लागू करना
ऐसी generator coroutine बनाएँ जो lazily values yield करे।
एक सरल generator लागू करना, CoddyKit पर C++ Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह C++ Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
कोरूटीन के रूप में जेनरेटर
जेनरेटर ऐसी कोरूटीन है जो एक बार में एक मान उत्पन्न करती है। जेनरेटर को हर बार बुलाने पर अगला मान मिलता है और कोरूटीन रुक जाती है।
Generator प्रकार
नेस्टेड promise_type वाला एक क्लास परिभाषित करें। कंपाइलर इसका उपयोग कोरूटीन की स्थिति सँभालने के लिए करता है।
template <typename T>
struct Generator {
struct promise_type {
T current_value;
Generator get_return_object() {
return Generator{std::coroutine_handle<promise_type>::from_promise(*this)};
}
std::suspend_always initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void return_void() {}
std::suspend_always yield_value(T value) {
current_value = value;
return {};
}
void unhandled_exception() { std::terminate(); }
};
std::coroutine_handle<promise_type> h;
// ... constructors, destructor, next() ...
};Generator का उपयोग
एक बार परिभाषित होने के बाद, जेनरेटर Python के मान उत्पन्न करने वाले तरीके जैसे सहज लगते हैं।
Generator<int> counting() {
int n = 0;
while (true) co_yield n++;
}
auto g = counting();
for (int i = 0; i < 5; ++i) {
std::cout << g.next() << " ";
}
// 0 1 2 3 4coroutine_handle
कंपाइलर एक std::coroutine_handle लौटाता है। यह रुकी हुई कोरूटीन का प्रतिनिधित्व करता है — आप resume(), destroy() चला सकते हैं या done() जाँच सकते हैं।
निलंबन बिंदु
हर co_yield कोरूटीन को रोकता है। जब कॉलर resume() चलाता है, तो निष्पादन अगले निलंबन या कोरूटीन के अंत तक जारी रहता है।
initial_suspend और final_suspend
दो अनुकूलन बिंदु:
initial_suspend— आलसी शुरुआत के लिएsuspend_alwaysलौटाएँ; तुरंत शुरुआत के लिएsuspend_neverfinal_suspend— सफ़ाई को नियंत्रित करता है। उचित विनाश के लिए आमतौर परsuspend_alwaysउपयोग किया जाता है
C++23 std::generator
C++23 ने std::generator को <generator> में जोड़ा। सामान्य मामलों के लिए अब आपको यह प्रकार हाथ से बनाने की आवश्यकता नहीं है।
#include <generator>
std::generator<int> counting() {
int n = 0;
while (true) co_yield n++;
}रेंज-आधारित लूप
यदि जेनरेटर प्रकार begin/end का समर्थन करता है, तो रेंज-आधारित लूप सीधे काम करता है।
for (int x : counting()) {
if (x >= 10) break;
std::cout << x;
}खींचने बनाम भेजने का व्यवहार
जेनरेटर खींचने पर आधारित होते हैं — पुनरावृत्ति को कॉलर नियंत्रित करता है। भेजने पर आधारित कोरूटीन असिंक्रोनस टास्क होते हैं।
उपयोग के मामले
जेनरेटर इन कामों के लिए बहुत अच्छे हैं:
- आवश्यकता-आधारित अनुक्रम (Fibonacci, अभाज्य संख्याएँ, पंक्ति-दर-पंक्ति फ़ाइल पाठक)
- डेटा को पहले से संग्रह किए बिना उसकी स्ट्रीमिंग
- वृक्ष जैसी संरचनाओं पर पुनरावृत्ति
मेमोरी संबंधी विचार
कोरूटीन फ़्रेम डिफ़ॉल्ट रूप से हीप पर आवंटित होता है। जब इनलाइनिंग की अनुमति हो, तो कंपाइलर आवंटन को हटा सकता है — प्रदर्शन महत्वपूर्ण हो तो माप अवश्य लें।
जानने योग्य लाइब्रेरियाँ
सीखने के लिए Lewis Baker की cppcoro में अच्छी तरह दस्तावेज़ीकृत जेनरेटर और टास्क प्रकार हैं। Boost.Asio कोरूटीन-अनुकूल I/O उपलब्ध कराता है। C++23 और उसके बाद के संस्करणों में मानक लाइब्रेरी का समर्थन मिलता है।
त्वरित जाँच
जेनरेटर कोरूटीन के लिए C++23 मानक लाइब्रेरी का प्रकार कौन-सा है?
पुनरावलोकन
जेनरेटर कोरूटीन co_yield के माध्यम से आवश्यकता के अनुसार मान उत्पन्न करती है। इसे promise_type वाले क्लास के रूप में लागू करें। C++23 ने std::generator को मानकीकृत किया। जेनरेटर आवश्यकता-आधारित अनुक्रमों और स्ट्रीमिंग के लिए उत्कृष्ट हैं।
एआई शिक्षक के साथ C++ सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 51
- पाठ
- 203
अक्सर पूछे जाने वाले प्रश्न
क्या “एक सरल generator लागू करना” पाठ निःशुल्क है?
हाँ — C++ Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “एक सरल generator लागू करना” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“एक सरल generator लागू करना” में मैं क्या सीखूँगा?
ऐसी generator coroutine बनाएँ जो lazily values yield करे। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C++ Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C++ Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C++ Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“एक सरल generator लागू करना” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C++ Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C++ Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Coroutine concepts: co_await, co_yield, co_return
- एक सरल generator लागू करना
- Async tasks और awaiter types
- Coroutine frame allocation