मैं पूछना चाहता हूं कि जब आप किसी फ़ाइल से पूर्णांक पढ़ते हैं तो accumulate
कैसे काम करता है। आम तौर पर accumulate
एक पुनरावर्तक लेता है जो एक कंटेनर और एक पुनरावर्तक की पहली स्थिति को इंगित करता है जो एक ही कंटेनर की अंतिम स्थिति (उदाहरण के लिए vector
) और प्रारंभिक मान को इंगित करता है। यदि हमें किसी फ़ाइल से डेटा पढ़ने की आवश्यकता है, तो निम्नलिखित कोड लिखा गया है:
ifstream dataFile("ints.dat");
accumulate(istream_iterator<int>(dataFile), istream_iterator<int>(), 0);
बनाए गए अस्थायी इटरेटर एक ही कंटेनर के इटरेटर नहीं हैं। मैं समझ नहीं पाया कि यह कैसे सही ढंग से काम करता है और इसके परिणामस्वरूप अंतहीन लूप नहीं होता है। accumulate
का संभावित कार्यान्वयन निम्नलिखित है:
template<class InputIt, class T>
T accumulate(InputIt first, InputIt last, T init)
{
for (; first != last; ++first)
{
init = init + *first;
}
return init;
}
1 उत्तर
यहां कोई कंटेनर शामिल नहीं है क्योंकि आप स्ट्रीम इटरेटर का उपयोग कर रहे हैं जिनके विशिष्ट व्यवहार हैं।
जब आप एक istream_iterator
बढ़ाते हैं, तो अंतर्निहित स्ट्रीम से एक मान पढ़ा जाता है। अगर पढ़ते समय कुछ गलत होता है (fail()
रिटर्न true
), तो इटरेटर एंड-ऑफ-स्ट्रीम इटरेटर बन जाता है।
एक डिफ़ॉल्ट रूप से निर्मित istream_iterator
हमेशा एक एंड-ऑफ-स्ट्रीम इटरेटर होता है, इसलिए दोनों इटरेटर बराबर की तुलना तभी करेंगे जब istream_iterator
पर इंक्रीमेंट ऑपरेटर अगले मान को पढ़ने में विफल रहता है (पर फ़ाइल का अंत, या जब कुछ गलत होता है)।
मानक से कुछ प्रासंगिक उद्धरण:
इसके निर्माण के बाद, और हर बार
++
है उपयोग किया जाता है, तो पुनरावर्तकT
के मान को पढ़ता है और संग्रहीत करता है। यदि इटरेटरT
(fail()
के मान को पढ़ने और संग्रहीत करने में विफल रहता है स्ट्रीम सही हो जाती है), पुनरावर्तक स्ट्रीम के अंत पुनरावर्तक मान के बराबर हो जाता है। बिना किसी तर्क के कंस्ट्रक्टरistream_iterator()
हमेशा एक एंड-ऑफ-स्ट्रीम इनपुट इटरेटर ऑब्जेक्ट बनाता है, जो है अंतिम स्थिति के लिए उपयोग किया जाने वाला एकमात्र वैध इटरेटर। [...]दो एंड-ऑफ-स्ट्रीम इटरेटर हमेशा बराबर होते हैं। एक एंड-ऑफ-स्ट्रीम इटरेटर एक गैर-एंड-ऑफ-स्ट्रीम इटरेटर के बराबर नहीं है। [...]
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।