Что касается другого вопроса SO о std::back_insert_iterator [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Что касается другого вопроса SO о std::back_insert_iterator [дубликат]

Сообщение Anonymous »

Я пытаюсь понять std::back_inserter и std::back_insert_iterator и прочитал этот вопрос о переполнении стека и ответы. Насколько я понимаю, в ответах говорится, что оператор *, ++, ++( int ) существует не просто так. Но если я правильно понимаю, код в этом вопросе ничего не делает в отношении операторов *,++,++(int). Кроме того, cppreference.com сообщает, что операторы *, ++, ++( int ) не работают.
Может ли кто-нибудь помочь мне понять, о чем говорят ответы на этот вопрос?
(Пожалуйста, дайте мне знать, если этот вопрос неуместен, поскольку речь идет о другом вопросе.)

Вот вопрос, который я упомянул выше:

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

Код: Выделить всё

template
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& operator=( const typename C::value_type& val ) {
container->push_back( val );
return *this;
}

back_insert_iterator& operator*() {
return *this;
}

back_insert_iterator& operator++() {
return *this;
}

back_insert_iterator& operator++( int ) {
return *this;
}
};
Я понял большую часть, кроме трех последних операторов *, ++, ++( int ). Я предполагаю, что их существование связано с тем, что им необходимо поддерживать операции, помещенные в алгоритм STL. Кроме этого, я не знаю, для чего они используются? Может ли кто-нибудь помочь мне прояснить это?


Ответ 1:

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

Ответ 2: p>

Ваше предположение верно, и не более того. Все дело в концепции OutputIterator. back_insert_iterator — это OutputIterator, а это означает, что он должен работать с любым алгоритмом, который ожидает OutputIterators. Чтобы такие алгоритмы могли работать, в OutputIterator должны быть определены эти операторы:

Ответ 3:

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


Подробнее здесь: https://stackoverflow.com/questions/785 ... t-iterator
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»