Страницы

Поиск по вопросам

среда, 26 февраля 2020 г.

С чем связано определение равенства потоковых итераторов?

#cpp #итераторы #iterator


Почему 2 std::istream_iterator считаются одинаковыми, даже если они указывают на
разные элементы одного потока? С чем связано такое определение?

Two stream iterators are equal if both of them are end-of-stream iterators or both
of them refer to the same stream.
    


Ответы

Ответ 1



Потому что std::istream_iterator указыает либо на конец связанного потока, либо на EOF. Когда вы выплняете инкремент итератора, он считывает элемент при помощи operator>>, а operator*, в свою очередь, просто возвращает ранее прочитанный элемент. Таким образом, std::istream_iterator всегда указывает туда, куда "указывает" связанный поток: std::istringstream stream{"1 2 3 4 5"}; std::istream_iterator it1{stream}; std::istream_iterator it2 = it1; std::cout << *it1 << std::endl; // 1 int i = 0; stream >> i; // take 2 ++it2; // take 3 ++it1; // take 4 std::cout << *it1 << std::endl; // 4 Пример

Ответ 2



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

Ответ 3



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

Комментариев нет:

Отправить комментарий