2012-01-15 8 views
12

इनपुट इटरेटर्स और केवल-पढ़ने वाले फ़ॉरवर्डर के बीच क्या अंतर है?इनपुट इटरेटर्स और केवल-पढ़ने वाले फ़ॉरवर्डर के बीच क्या अंतर है?

क्योंकि बाद वाले केवल पढ़ने के लिए, वे स्पष्ट रूप से आउटपुट इटरेटर की आवश्यकताओं को पूरा नहीं करते हैं। और, इसके कारण, वे अतिरिक्त गारंटी (यदि कोई हो) के साथ प्रभावी रूप से इनपुट इटरेटर इनपुट कर रहे हैं। समस्या यह है कि, अतिरिक्त गारंटी क्या है?

मेरा अनुमान है कि आगे के इटरेटर बहु-पास हैं और इनपुट इटरेटर नहीं हैं, क्या मैं सही हूँ?

उत्तर

20

हां, इनपुट इटरेटर एक-पास इटरेटर हैं। आप केवल एक बार फिर से इसे फिर से चालू कर सकते हैं, जबकि आगे इटरेटर बहु-पास हैं।

§24.2.3 [input.iterators] p2 (the table) से, ++r के पूर्व/postcondition स्तंभ:

पूर्व: r dereferenceable है।
पोस्ट: r अस्वीकार्य है या r पिछले-अंत में है।
पोस्ट: r के पिछले मान की कोई भी प्रतियां अब या तो == के डोमेन में होने की आवश्यकता नहीं है।

पिछले postcondition का तात्पर्य है कि a == b के लिए, ++a == ++btrue होने की आवश्यकता नहीं है।
एक ही खंड, पैरा 3:

[नोट: इनपुट iterators के लिए, ख एक == ++ एक == ++ ख संकेत नहीं करता है। (समानता प्रतिस्थापन संपत्ति या संदर्भित पारदर्शिता की गारंटी नहीं देती है।) इनपुट इटरेटर्स पर एल्गोरिदम को कभी भी एक ही इटरेटर से दो बार पारित करने का प्रयास नहीं करना चाहिए। वे एकल पास एल्गोरिदम होना चाहिए। [...] इन एल्गोरिदम का उपयोग istream_iterator क्लास टेम्पलेट के माध्यम से इनपुट डेटा के स्रोत के रूप में istreams के साथ किया जा सकता है। अंत टिप्पणी]

§24.2.5 [forward.iterators]

p1 एक वर्ग या सूचक प्रकार X संतुष्ट करता है, तो

  • [...]
  • वस्तुओं एक आगे इटरेटर की आवश्यकताओं से टाइप X नीचे वर्णित बहु-पास गारंटी प्रदान करते हैं।

p3 दो dereferenceable iterators एक और प्रकार X की ख की पेशकश बहु-पास गारंटी यदि:

  • a == b तात्पर्य ++a == ++b और
  • X एक सूचक प्रकार या अभिव्यक्ति है (void)++X(a), *a बराबर है अभिव्यक्ति *a पर।
+5

तो विशिष्ट उदाहरण एक धारा इटरेटर (एकल पास, इनपुट-इटरेटर) हो सकता है, और एक अकेले लिंक्ड सूची (बहु-पास आगे इटरेटर) – jalf

+0

ओह, वैसे, एक upboat है। +1 – jalf

संबंधित मुद्दे