2011-01-19 15 views
9

nasıl back_inserter işi anlamaya çalışıyorum ve bu SGI STL olması onun uygulamasıdır:Back_inserter nasıl çalışır?

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; 
    } 
}; 

anladım son üç operatör * hariç çoğu parçalar, ++, ++ (int). Varlıkları için tahminim, STL algoritmasının içine yerleştirildiğinde operasyonları desteklemeleri gerektiğidir. Bunun dışında ne için kullanıldığını bilmiyorum? Birisi bunu açıklığa kavuşturmama yardımcı olabilir mi? STL algoritmaları sonrası olmak ve incrementable öncesi ve KQUEUE operatörü olmalıdır Yineleyicilerin üzerinde çalıştıkları için

sayesinde
Chan

cevap

6

Varlar.

bu ne düşünmeye çalışın:

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

harika teşekkürler;). Cevabınız inanılmaz derecede hızlı oldu ^^ – Chan

4

Tahminin doğru olduğunu ve bundan daha fazla bir şey yoktur. Her şey OutputIterator konsepti ile ilgili. back_insert_iterator bir OutputIterator'dır, yani OutputIterator'ları bekleyen herhangi bir algoritma ile çalışması gerektiği anlamına gelir. OutputIterator böyle algoritmalar işe yarayabilir böylece tanımlanan bu operatörler olması gerekir:

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

harika teşekkürler;) Şimdi anladım! – Chan

1

back_inserter() bir output iterator gibi işlev olan bir back_insert_iterator döndürür. Özellikle, ön ve son artırma ve dereference atama gibi işlemleri desteklemelidir.

Bu işlemleri desteklemiyorsa, çıktı yineleyicilerinin gerektiği yerlerde kullanılamaz.

+0

Teşekkürler;) Şimdi anladım – Chan