Как работает back inserter?

Я пытаюсь понять, как back_inserter работа, и это его реализация, которую я имею от SGI-STL:

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). Я предполагаю, что их существование связано с тем, что им нужно поддерживать операции при размещении внутри алгоритма STL. Кроме этого, я не знаю, для чего они используются? Кто-нибудь может помочь мне прояснить это?

спасибо,
Чан!--3-->

3 ответов


они существуют, потому что алгоритмы STL работают на итераторах, которые должны быть post и pre incrementable и иметь оператор разыменования.

попробуйте подумать, что это делает:

(*back_inserter) = value;
++back_inserter;

ваша догадка верна, и нет ничего больше. Это все о концепции OutputIterator. back_insert_iterator является OutputIterator, это означает, что он должен работать с любым алгоритмом, который ожидает OutputIterators. 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;
}

back_inserter() возвращает back_insert_iterator, который должен функционировать как выход итератора. В частности, он должен поддерживать такие операции, как приращение до и после и назначение разыменования.

если он не поддерживает эти операции, он не может использоваться там, где требуются выходные итераторы.