Как работает back_inserter? - PullRequest
       6

Как работает back_inserter?

11 голосов
/ 19 января 2011

Я пытаюсь понять, как 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 ]

8 голосов
/ 19 января 2011

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

Попытайтесь подумать, что это делает:

(*back_inserter) = value;
++back_inserter;
4 голосов
/ 19 января 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...