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