2009-06-30 16 views
7

मैंने अपने स्वयं के कंटेनर टेम्पलेट को एक इटरेटर के साथ लिखा है। मैं const_iterator कैसे कार्यान्वित करूं?सी ++: कॉन्स्ट_इटरेटर कैसे लिखें?

template <class T> 
class my_container { 
private: 
    ... 

public: 
    my_container() : ... { } 
    ~my_container() { } 

    class iterator : public std::iterator<std::bidirectional_iterator_tag, T> { 
    public: ... 

उत्तर

4

फर्क सिर्फ इतना होना चाहिए कि जब आप को डी-संदर्भ एक स्थिरांक इटरेटर आप कंटेनर में वस्तु के लिए एक संदर्भ के बजाय एक स्थिरांक संदर्भ मिलता है।

+1

इटरेटर को तर्क के रूप में लेने या इटरेटर्स को वापस करने के तरीकों के बारे में क्या? मुझे const_iterators के लिए उन्हें अधिभारित करना होगा? दोहराया कोड का एक गुच्छा की तरह लगता है। –

+0

इटरेटर्स को const_iterators में परिवर्तनीय होना चाहिए, इसलिए आपको केवल अधिभारित नहीं करना होगा यदि आपको केवल const_iterator की आवश्यकता है। आप प्रारंभ(), अंत() जैसे कार्यों के लिए करते हैं, लेकिन इसके आस-पास कोई रास्ता नहीं है, क्योंकि कॉन्स्ट भी विधि के हस्ताक्षर का हिस्सा है। –

+2

@ पॉस्को ग्रब: नहीं। यदि आपके पास विधियां लेने वाले विधियां हैं तो टेम्पलेट का उनका। इस विधि को किसी भी चीज के लिए काम करना चाहिए जो एक इटरेटर की तरह कार्य करता है। यदि विधि को const_iterator की बजाय एक पुनरावर्तक की आवश्यकता होती है तो संकलक उचित त्रुटि उत्पन्न करेगा। –

2

मुझे इटरेटर्स को लागू करने का सबसे आसान तरीका boost::iterator है। आप अपने खुद के रोल करना चाहते हैं, मुझे लगता है कि हस्ताक्षर किया जाना चाहिए:

class const_iterator : public std::iterator<std::bidirectional_iterator_tag, const T> { 
कार्यान्वयन के साथ

ही (यह मानते हुए आप reference_type और अपने समारोह हस्ताक्षर में इसके आगे का उपयोग कर रहे हैं)

+0

में परिवर्तित कर सकते हैं मुझे यह आश्चर्य हुआ कि iterator_traits :: const_iterator> :: value_type int है, int const नहीं है (टी, आपके कोड में कॉन्स टी के बजाय)। मुझे लगता है कि कॉन्स के साथ और अधिक समझ में आता है। हालांकि, नीचे की रेखा यह है कि यदि आप मानक कंटेनर के साथ मेल करना चाहते हैं, तो आपको गैर-कॉन्स टी –

+0

का उपयोग करने की आवश्यकता है। कॉन्स इटरेटर के साथ महत्वपूर्ण बात यह है कि आप इसका उपयोग इस संग्रह को पुन: चालू करने के लिए नहीं कर सकते हैं। तो, टी या कॉन्स टी और उपयुक्त हैं। केवल टी के साथ कॉन्स का उपयोग करना जरूरी नहीं है (क्योंकि रिटर्न एक प्रतिलिपि होगी) –

+0

ठीक है, अगर आप यह निर्दिष्ट करना चाहते हैं कि बाय-वैल्यू गैर-कॉन्स है, तो आपको सभी पैरामीटर निर्दिष्ट करना होगा: कक्षा const_iterator: public std :: इटरेटर । मैं एसटीएल वेक्टर के अनुरूप होने के बजाय ब्रेवटी (असाइनमेंट/समानता कीड़े के खिलाफ कुछ अतिरिक्त सुरक्षा के साथ) के साथ जाऊंगा, लेकिन यह एक डिजाइन दृष्टिकोण से एक कठिन विकल्प है। –

0

रोजर पेट, value_types हैं "सरल"। मुझे संदेह है कि यदि आप iterator_traits :: const_iterator> :: संदर्भ देखें, तो मुझे लगता है कि "const int &" होगा।

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