2011-01-19 12 views
9

मैं समझता हूँ कि कैसे back_inserter काम कोशिश कर रहा हूँ, और यह इसके कार्यान्वयन है कि मैं एसजीआई-एसटीएल से है:back_inserter कैसे काम करता है?

template<class C> 
class back_insert_iterator { 
protected: 
    C* container; 
public: 
    typedef C     container_type; 
    typedef output_iterator_tag iterator_category; 
    typedef void    value_type; 
    typedef void    difference_type; 
    typedef void    pointer; 
    typedef void    reference; 

    explicit back_insert_iterator(C& __x) :container(&__x) { 
    } 

    back_insert_iterator<C>& operator=(const typename C::value_type& val) { 
     container->push_back(val); 
     return *this; 
    } 

    back_insert_iterator<C>& operator*() { 
     return *this; 
    } 

    back_insert_iterator<C>& operator++() { 
     return *this; 
    } 

    back_insert_iterator<C>& operator++(int) { 
     return *this; 
    } 
}; 

मैं समझ अधिकांश हिस्सों को छोड़कर पिछले तीन ऑपरेटर *, ++ ++ (int)। उनके अस्तित्व के लिए मेरा अनुमान यह है कि एसटीएल एल्गोरिदम के अंदर रखे जाने पर उन्हें संचालन का समर्थन करने की आवश्यकता होती है। इसके अलावा, मुझे नहीं पता कि वे किस लिए उपयोग किए जाते हैं? क्या कोई मुझे इसे स्पष्ट करने में मदद कर सकता है?

धन्यवाद,
चैन

उत्तर

6

वे मौजूद हैं, क्योंकि एसटीएल एल्गोरिदम iterators जो बाद हो सकता है और incrementable पूर्व और एक भिन्नता ऑपरेटर होना आवश्यक है पर काम करते हैं।

इस क्या करता है सोचने की कोशिश करें:

(*back_inserter) = value; 
++back_inserter; 
+0

बहुत धन्यवाद;)। आपकी प्रतिक्रिया आश्चर्यजनक रूप से त्वरित थी ^^ – Chan

4

आपका अनुमान सही है और कि से ज्यादा कुछ नहीं है। यह आउटपुट इटरेटर अवधारणा के बारे में सब कुछ है। back_insert_iterator एक आउटपुटइटरेटर है, जिसका अर्थ है कि इसे किसी भी एल्गोरिदम के साथ काम करना चाहिए जो आउटपुटइटरेटर्स की अपेक्षा करता है। OutputIterator इन ऑपरेटरों परिभाषित इसलिए इस तरह एल्गोरिदम काम कर सकता था होना चाहिए:

template<class InputIterator, class OutputIterator> 
OutputIterator copy(
    InputIterator first, InputIterator last, OutputIterator result) 
{ 
    while(first != last) 
     // uses operators =, * and post ++ of OutputIterator. 
     *result++ = *first++; 
    return result; 
} 
+0

बहुत धन्यवाद;) मुझे अब मिल गया! – Chan

1

back_inserter() एक back_insert_iterator देता है, एक output iterator की तरह कार्य करने के लिए किया है। विशेष रूप से, इसे पूर्व-और पोस्ट वृद्धि, और dereference असाइनमेंट जैसे संचालन का समर्थन करना होगा।

यदि यह उन परिचालनों का समर्थन नहीं करता है, तो इसका उपयोग नहीं किया जा सकता है जहां आउटपुट इटरेटर्स की आवश्यकता होती है।

+0

धन्यवाद;) मुझे अब मिल गया – Chan

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