#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_iteratorit1{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 всегда работают с текущим положением потока. Элемент, к которому получается доступ при разыменовании итератора, хранится в самом итераторе, а не где-то в потоке. Этим он радикально отличается от итераторов контейнеров.
Комментариев нет:
Отправить комментарий