2012-08-13 17 views
8

इटरेटर जो आउटपुट इटरेटर्स की आवश्यकताओं को और संतुष्ट करते हैं उन्हें म्यूटेबल इटरेटर्स कहा जाता है। Nonmutable iterators को निरंतर iterators के रूप में जाना जाता है। [24.2.1: 4]क्या एक म्यूटेबल इनपुट इटेटरेटर बढ़ाना पुराने इटरेटर मूल्यों को अमान्य करता है?

यह सुझाव देता है कि आपके पास एक परिवर्तनीय इनपुट इटरेटर हो सकता है, जो इनपुट और आउटपुट इटरेटर दोनों की आवश्यकताओं को पूरा करता है।

इनपुट इटरेटर को बढ़ाने के बाद, इसके पुराने मूल्य की प्रतियों को अस्वीकार्य नहीं होना चाहिए [24.2.3]। हालांकि, मानक आउटपुट इटरेटर्स के लिए मानक ऐसा नहीं कहता है; वास्तव में, पोस्टफिक्स वृद्धि के लिए परिचालन अर्थशास्त्र { X tmp = r; ++r; return tmp; } के रूप में दिए गए हैं, जो यह बताते हैं कि आउटपुट इटरेटर पुराने इटरेटर मूल्यों की प्रतियां (प्रतियां) को अमान्य नहीं कर सकते हैं।

तो, क्या एक परिवर्तनीय इनपुट इटरेटर को पुरानी पुनरावर्तक प्रतियों को अमान्य कर सकते हैं?

यदि हां, तो आप X a(r++); *a = t या X::reference p(*r++); p = t जैसे कोड का समर्थन कैसे करेंगे (उदा।) प्रॉक्सी ऑब्जेक्ट?

यदि नहीं, तो boost::iterator का दावा क्यों है कि इसे प्रॉक्सी ऑब्जेक्ट की आवश्यकता है? (लिंक कोड है; struct एस writable_postfix_increment_proxy और postfix_increment_result पर टिप्पणियों को पढ़ने के लिए नीचे स्क्रॉल करें)। यही है, अगर आप पुरानी इटरेटर मूल्य की एक (अस्वीकार्य) प्रतिलिपि वापस कर सकते हैं, तो आपको इस प्रति को प्रॉक्सी में क्यों लपेटना होगा?

+0

ओह, मैं इन भाषा-वकील प्रश्नों से कैसे घृणा करता हूं। एक पिन के सिर पर कितने स्वर्गदूत नृत्य करते हैं, इस बारे में भी तर्क दे सकते हैं। –

+4

@MarkRansom हाँ, मुझे यकीन है कि जब लोग उस भाषा को समझने की कोशिश करते हैं तो वे नफरत करते हैं। उन सभी को डर दो ... और मुझे इस * टिप्पणी * में उनके लिए मेरी नफरत के बारे में बताने की जरूरत है (रिकॉर्ड के लिए, इटरेटर श्रेणियां सी ++ में एक बड़ा सौदा है। समझना कि उनमें से प्रत्येक क्या कर सकता है) – jalf

+0

@MarkRansom: मेरा प्रश्न मेरे लिए महत्वपूर्ण है क्योंकि एक सकारात्मक जवाब का मतलब है कि मुझे बूस्ट करता है जैसे म्यूटेबल इनपुट इटरेटर्स को संभालने के लिए मुझे अपनी कक्षा में एक और प्रॉक्सी ऑब्जेक्ट जोड़ना होगा। नीचे दी गई सहमति से पता चलता है कि एक परिवर्तनीय इनपुट इटरेटर (24.2.1: 4 में टिप्पणी के बावजूद) जैसी कोई चीज़ नहीं है। बदले में यह सुझाव देता है कि बूस्ट "म्यूटेबल इनपुट इटरेटर्स" के संचालन में गलत है --- यदि बूस्ट डेवलपर्स मानक के इस पहलू को गलत समझते हैं, तो क्या यह कोई मुद्दा नहीं है जिसे संबोधित किया जाना चाहिए? – nknight

उत्तर

6

स्पष्टीकरण अगर अगले भाग में पाया जाता है, [24.2.5] फॉरवर्ड iterators, जहां यह कहा गया है कि कैसे इन इनपुट और आउटपुट iterators से अलग:

दो dereferenceable iterators a और प्रकार के bX प्रस्ताव बहु-पास गारंटी यदि:

- a == b तात्पर्य ++a == ++b और
- X एक सूचक प्रकार या अभिव्यक्ति है +०१२३४५६२५३४६अभिव्यक्ति *a के समतुल्य है।

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

दुर्भाग्य से, मानक एक पूरे के रूप में पढ़ा जाना चाहिए, और स्पष्टीकरण हमेशा जहां आप इसे होने की उम्मीद नहीं है।

+0

मैं अभी भी उलझन में हूँ, क्षमा करें। क्या आप कह रहे हैं कि एक परिवर्तनीय इनपुट इटरेटर पुराने मानों को अमान्य नहीं करने के लिए, इसे बहु-पास गारंटी को पूरा करना होगा? मैं आपके जवाब की सराहना करता हूं! – nknight

+2

नहीं, मैं कह रहा हूं कि एक आगे इटरेटर को जो भी आप चाहते हैं उसे करने की आवश्यकता है, एक इनपुट इटरेटर नहीं है। मानक के बीच में कुछ भी नहीं है। भले ही आपके पास अग्रेषित इटरेटर के कुछ * गुण हैं, फिर भी यह एक इनपुट या आउटपुट इटरेटर है जब तक कि * सभी * आवश्यकताएं पूरी नहीं होतीं। ध्यान दें कि इनपुट इटरेटर को कीबार्ड से जोड़ा जा सकता है। यहां तक ​​कि यदि आप इसकी एक प्रति सहेजते हैं, तो आप बैक अप नहीं ले सकते हैं और मुझे टेक्स्ट को फिर से टाइप कर सकते हैं। आउटपुट इटरेटर के लिए समान, यह सीधे प्रिंटर पर जा सकता है। –

+2

ओह! मैं भविष्य में पुन: उपयोग के लिए उस कीबोर्ड/प्रिंटर समरूपता को सहेज दूंगा: डी –

4

इनपुट और आउटपुट इटरेटर्स मूल रूप से सिंगल-पास ट्रैवर्सल को अनुमति देने के लिए डिज़ाइन किए गए हैं: अनुक्रमों का वर्णन करने के लिए जहां प्रत्येक तत्व को केवल एक बार देखा जा सकता है।

स्ट्रीम एक महान उदाहरण हैं। यदि आप stdin या सॉकेट से पढ़ते हैं, या फ़ाइल में लिखते हैं, तो केवल स्ट्रीम की वर्तमान स्थिति होती है। जब आप एक इटरेटर को बढ़ाते हैं तो उसी अंतर्निहित अनुक्रम को इंगित करने वाले अन्य सभी पुनरावर्तक अमान्य होते हैं।वे यह सुनिश्चित करें कि आप अपने इटरेटर कॉपी कर सकते हैं, मूल को बढ़ा देते हैं, और प्रति वर्ष स्थिति के लिए अभी भी बिंदु, तुम वहाँ से पुनरावृति कर सकते हैं ताकि देगा:

फॉरवर्ड iterators बहु-पास ट्रेवर्सल, अतिरिक्त गारंटी की जरूरत की अनुमति देते हैं ।

+0

"* जब आप एक इटरेटर को बढ़ाते हैं तो उसी अंतर्निहित अनुक्रम को इंगित करने वाले सभी अन्य इटरेटर्स अमान्य होते हैं। *" --- वास्तव में यह मानक (इनपुट और आउटपुट इटरेटर दोनों के लिए) का इरादा है, हालांकि सी ++ 11 नहीं है यह ठीक करने के बाद आउटपुट इटरेटर्स के लिए यह स्पष्ट नहीं है: (http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2035) इसे प्रकाशित संस्करण में नहीं बनाया (अधिक जानकारी के लिए http://stackoverflow.com/a/11938988/985943 देखें)। – nknight