2011-10-13 16 views
15

मैं const_iterator को iterator से सी ++ में कैसे प्राप्त करूं? const_iterator के बारे में insert_iterator से क्या? परिणामी iterator मूल स्थान के समान स्थान पर इंगित करना चाहिए।सी ++ iterator to const_iterator

+0

कास्टिंग काम नहीं करता है? – Pubby

+1

@ Pubby8: एक कलाकार की भी आवश्यकता नहीं है! –

+0

हू, मुझे गड़बड़ होनी चाहिए। मैंने सोचा कि मुझे एक कंपाइलर त्रुटि मिली है जब मैंने उन्हें स्पष्ट रूप से रूपांतरित करने की कोशिश की। –

उत्तर

22

कंटेनरों iterator एक प्रकार const_iterator के लिए परिवर्तनीय के रूप में प्रदान करने के लिए आवश्यक हैं, तो आप परोक्ष परिवर्तित कर सकते हैं:

Container::iterator it = /* blah */; 
Container::const_iterator cit = it; 

std::insert_iterator रों उत्पादन iterators हैं। यह उन्हें नियमित Container::iterator में परिवर्तित करने का कोई तरीका नहीं देता है जो एक आगे इटरेटर होना चाहिए।

एक और प्रकार का डालने वाला इटरेटर ऐसी चीज की अनुमति दे सकता है, लेकिन मानक कार्यों से प्राप्त किए गए लोग नहीं करते हैं।

मुझे लगता है कि आप अपने खुद के आवरण के आसपास std::insert_iterator कि संरक्षित सदस्य iter को उजागर करता है, हालांकि लिख सकते हैं:

template <typename Container> 
class exposing_insert_iterator : public std::insert_iterator<Container> { 
public: 
    exposing_insert_iterator(std::insert_iterator<Container> it) 
    : std::insert_iterator<Container>(it) {} 
    typename Container::iterator get_iterator() const { 
     return std::insert_iterator<Container>::iter; 
    } 
}; 

// ... 
std::insert_iterator<Container> ins_it; 
exposing_insert_iterator<Container> exp_it = ins_it; 
Container::iterator it = exp_it.get_iterator(); 
4

आप उन्हें बदल सकते हैं। उदाहरण:

std::vector<int> v; 
std::vector<int>::iterator it = v.begin(); 
std::vector<int>::const_iterator cit = it; 

लेकिन मुझे लगता है कि यह वह जवाब नहीं है जिसे आप चाहते हैं। मुझे कोड दिखाओ :-)

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