back_inserter如何工作?

时间:2011-01-19 08:03:50

标签: c++ stl

我试图了解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 个答案:

答案 0 :(得分:8)

它们的存在是因为STL算法适用于迭代器,迭代器必须是post和pre incrementable并且有一个dereference运算符。

试着想一想这是做什么的:

(*back_inserter) = value;
++back_inserter;

答案 1 :(得分:4)

你的猜测是正确的,只有那个。这都是关于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;
}

答案 2 :(得分:1)

back_inserter()会返回back_insert_iterator,其必须像output iterator一样运行。具体来说,它必须支持诸如增量前和后增量以及解除引用分配等操作。

如果它不支持这些操作,则无法在需要输出迭代器的地方使用它。