我试图了解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算法内时支持操作。除此之外,我不知道他们用的是什么?任何人都可以帮我澄清一下吗?
谢谢,
陈
答案 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一样运行。具体来说,它必须支持诸如增量前和后增量以及解除引用分配等操作。
如果它不支持这些操作,则无法在需要输出迭代器的地方使用它。