2010-05-16 9 views
14

another question about iterators के बाद मुझे कस्टम कंटेनर के बारे में कुछ संदेह हैं। मेरे कंटेनर में, iteratorconst_iterator का उप-वर्ग है, ताकि मुझे गैर-कॉन्स से "मुक्त" में रूपांतरण प्राप्त हो। लेकिन क्या इस तरह के सेटअप के लिए यह अनुमति है या कोई कमी या गैर-कार्य परिदृश्य हैं?क्या 'पुनरावर्तक' टाइप कर सकते हैं बस subclass 'const_iterator'?

उत्तर

7

हाँ, यह ठीक है। उदाहरण के लिए, vector के लिए इटरेटर के वीसी 10 के कार्यान्वयन को संरचित किया गया है। <vector> में _Vector_iterator और _Vector_const_iterator देखें।

वैसे, इटरेटर लिखना मुश्किल है। बूस्ट :: इटरेटर लाइब्रेरी सीखने और उपयोग करने के लिए आपका समय लायक है।

+0

मुझे पता है, लेकिन मेरे मामले में यह एक छोटी पुस्तकालय है और मैं नहीं चाहता कि यह बूस्ट भागों सहित किसी भी चीज़ पर निर्भर करे। – doublep

+0

यह पहले से ही अच्छा है कि एसटीएल के कुछ कार्यान्वयन इस तरह काम करते हैं। क्या आपको मानक में एक खंड पता है जो सामान्य रूप से इटरेटर और आवश्यकताओं का वर्णन करता है? – doublep

+0

एफसीडी (एन 3035.pdf) का 24.2 इटरेटर और उनकी आवश्यकताओं का वर्णन करता है –

0

एक ऐसे मामले के बारे में सोचें जिसके लिए आपको इटरेटर के सदस्यों को संशोधित करने की आवश्यकता होगी।

+4

और? मुझे लगता है कि आपको विस्तृत करने की जरूरत है। – doublep

2

सबक्लासिंग मेरे लिए अजीब लगती है, लेकिन प्रभावी रूप से एक मुद्दा है।

भले ही आप बूस्ट भागों पर निर्भर नहीं होना चाहते हैं, बूस्ट.इटरेटर लाइब्रेरी, और अधिक विशेष रूप से iterator_facade और iterator_adaptor बिट्स की जांच करें।

iterator और const_iterator को अपनी कक्षा के लिए बहुत अधिक डुप्लिकेट किए बिना लिखने का एक पूर्ण उदाहरण है।

template <class Value> class iterator_base; 

typedef iterator_base<T> iterator; 
typedef iterator_base<const T> const_iterator; 

उपवर्गीकरण साथ मुद्दा है कि आप तो एक आभासी नाशक प्रदान करना चाहिए और आप कर रहे हैं: उनके विचार एक टेम्पलेट iterator_base वर्ग है जिसे आप की पंक्ति में स्थिरांक और गैर स्थिरांक प्रकार के लिए उपयोग कर सकते हैं लिखने के लिए है स्लाइसिंग के संपर्क में (const_iterator को iterator से बनाते समय)

तो, यहां दूसरों के विपरीत, मुझे यह "ठीक" नहीं मिला।

+2

"आपको फिर आभासी विनाशक प्रदान करना चाहिए" - लेकिन मेरे विनाशक वैसे भी कुछ नहीं करते हैं। यहां तक ​​कि अगर उन्होंने किया, तो 'इटरेटर' प्रकार शायद कुछ भी किए बिना, 'const_iterator' विनाशक का उत्तराधिकारी होगा। "आप टुकड़े करने के लिए उजागर हो गए हैं" - क्या आप कृपया विस्तार से बता सकते हैं, मुझे समझ में नहीं आता कि आपका क्या मतलब है। – doublep

+1

स्लाइसिंग का एक उदाहरण, 'इसे पुनरावर्तक; const_iterator cit = static_cast (it); '। यहां, जब आप टाइपकास्ट 'it' से' cit' असाइन कर रहे हैं, तो जो भी अतिरिक्त चर आपने 'it' में जोड़ा है ** ** **' cit' में कॉपी नहीं किया गया है। लेकिन मुझे लगता है कि यह ठीक है क्योंकि हम कभी भी 'इटरेटर' को फिर से कम नहीं कर सकते हैं। – Hindol

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