2015-05-21 3 views
6

उदाहरण के लिए, कहें कि मेरे पास एसटीएल std::vector आंतरिक रूप से उपयोग करने से एक कस्टम कंटेनर है। अगर मैं std::vector<char*>::iterator से my_container::iterator टाइप करता हूं, तो पुनरावर्तक को अस्वीकार करने से char* वापस आ जाएगा। हालांकि, मेरे कस्टम कंटेनर को अपने आंतरिक छिपाना चाहिए, जिसका अर्थ है कि मैं एक char वापस करने के लिए एक dereferencing चाहते हैं।एक कस्टम इटरेटर में एक एसटीएल कंटेनर लपेटने के लिए सबसे अच्छा तरीका क्या है?

यह कैसे पूरा किया जा सकता है?

class my_container { 
public: 

    typedef std::vector<char*> vector; 

private: 

    vector vec_; 

}; 

अद्यतन:char* एक उदाहरण है। इसका मतलब सी स्ट्रिंग नहीं है; उदाहरण int के साथ स्पष्ट होगा।

इसके अलावा, मैं std::forward_iterator_tag और std::iterator का उपयोग करना चाहूंगा क्योंकि यह एक अधिक मानक/वर्तमान दृष्टिकोण प्रतीत होता है।

+0

आप अपनी खुद की इटरेटर, एक को लागू करने की आवश्यकता हो सकती है कि दो स्तरों ('चार *' वास्तविक इटरेटर की, और 'char' अपने भिन्नता ऑपरेटर के लिए) पर दोहराता। –

+0

'char' कहां से आता है, क्या आप वेक्टर के भीतर प्रत्येक सबस्ट्रिंग पर दोहराए जाने या सिर्फ दो बार संदर्भित करने का मतलब है? – Barry

उत्तर

5

यदि आप अपना खुद का इटरेटर चाहते हैं, तो बस इसे नेस्टेड क्लास के रूप में लिखना शुरू करें। यह सामान्य कार्यों में अवरोध उत्पन्न कर, एक std::vector<char*>::iterator रैप करने के लिए की आवश्यकता होगी (जैसे ++, *, --), की तरह कुछ:

class iterator 
{ 
    public: 
    iterator& operator++() { ++i_; return *this; } 
    char& operator*() { return **i_; } 
    ...etc... 

    private: 
    std::vector<char*>::iterator i_; 
}; 

आप इसे कोशिश करते हैं और अटक जाते हैं, तो आपके प्रयास पोस्ट और हम आगे आपकी मदद करेंगे।

1

उपयोग boost::indirect_iterator:

एक तरीका है कि boost.org में अच्छा लोगों द्वारा वास्तव में इस उद्देश्य के लिए बनाया गया है बहुत उपयोगी ढांचे का उपयोग करने के लिए है।

संपादित करें: (untested)

struct S 
{ 
    using iterator = 
     boost::indirect_iterator<std::vector<char*>::iterator>; 
    using const_iterator = 
     boost::indirect_iterator<std::vector<char*>::const_iterator>; 

    iterator begin() { return iterator(vec_.begin()); } 
    iterator end() { return iterator(vec_.begin()); } 
    const_iterator begin() const { return const_iterator(vec_.begin()); } 
    const_iterator end() const { return const_iterator(vec_.begin()); } 
private: 
    std::vector<char*> vec_; 
}; 
+1

आप अपने उत्तर में यह सुधार कर सकते हैं कि यह प्रश्न का उत्तर कैसे देता है – mpromonet

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