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

190
31 июля 2021, 02:20

Почему 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.

Answer 1

Потому что std::istream_iterator указыает либо на конец связанного потока, либо на EOF. Когда вы выплняете инкремент итератора, он считывает элемент при помощи operator>>, а operator*, в свою очередь, просто возвращает ранее прочитанный элемент.

Таким образом, std::istream_iterator всегда указывает туда, куда "указывает" связанный поток:

std::istringstream stream{"1 2 3 4 5"};
std::istream_iterator<int> it1{stream};
std::istream_iterator<int> 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

Пример

Answer 2

если они указывают на разные элементы одного потока?

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

Answer 3

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

READ ALSO
Как Подготовить запрос sql QT?

Как Подготовить запрос sql QT?

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

352
как разыменовать двойной указатель на класс

как разыменовать двойной указатель на класс

есть указатель на массив объектов s и указатель на s

111
ofstream. Записать char в начало файла

ofstream. Записать char в начало файла

Собственно, есть std::ofstream file

111
Ошибка &ldquo;Stack around the variable was corrupted&rdquo;

Ошибка “Stack around the variable was corrupted”

Есть такой код, которые считает свободное место на диске:

147