मैं पूछना चाहता हूं कि जब आप किसी फ़ाइल से पूर्णांक पढ़ते हैं तो 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
getsoubl 3 अगस्त 2017, 12:29

1 उत्तर

यहां कोई कंटेनर शामिल नहीं है क्योंकि आप स्ट्रीम इटरेटर का उपयोग कर रहे हैं जिनके विशिष्ट व्यवहार हैं।

जब आप एक istream_iterator बढ़ाते हैं, तो अंतर्निहित स्ट्रीम से एक मान पढ़ा जाता है। अगर पढ़ते समय कुछ गलत होता है (fail() रिटर्न true), तो इटरेटर एंड-ऑफ-स्ट्रीम इटरेटर बन जाता है।

एक डिफ़ॉल्ट रूप से निर्मित istream_iterator हमेशा एक एंड-ऑफ-स्ट्रीम इटरेटर होता है, इसलिए दोनों इटरेटर बराबर की तुलना तभी करेंगे जब istream_iterator पर इंक्रीमेंट ऑपरेटर अगले मान को पढ़ने में विफल रहता है (पर फ़ाइल का अंत, या जब कुछ गलत होता है)।


मानक से कुछ प्रासंगिक उद्धरण:

[istream.iterator-1]

इसके निर्माण के बाद, और हर बार ++ है उपयोग किया जाता है, तो पुनरावर्तक T के मान को पढ़ता है और संग्रहीत करता है। यदि इटरेटर T (fail() के मान को पढ़ने और संग्रहीत करने में विफल रहता है स्ट्रीम सही हो जाती है), पुनरावर्तक स्ट्रीम के अंत पुनरावर्तक मान के बराबर हो जाता है। बिना किसी तर्क के कंस्ट्रक्टर istream_iterator() हमेशा एक एंड-ऑफ-स्ट्रीम इनपुट इटरेटर ऑब्जेक्ट बनाता है, जो है अंतिम स्थिति के लिए उपयोग किया जाने वाला एकमात्र वैध इटरेटर। [...]

[istream.iterator-2]

दो एंड-ऑफ-स्ट्रीम इटरेटर हमेशा बराबर होते हैं। एक एंड-ऑफ-स्ट्रीम इटरेटर एक गैर-एंड-ऑफ-स्ट्रीम इटरेटर के बराबर नहीं है। [...]

3
Holt 3 अगस्त 2017, 13:01