Почему 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.
Потому что 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
Пример
если они указывают на разные элементы одного потока?
А такое возможно вообще? Поток как бы синглетон в плане состояния, istream_iterator не скользит по потоку, а просто удобная обертка, чтобы можно было использовать во всех остальных местах STL.
В потоке нет разных элементов, istream_iterator
всегда работают с текущим положением потока. Элемент, к которому получается доступ при разыменовании итератора, хранится в самом итераторе, а не где-то в потоке. Этим он радикально отличается от итераторов контейнеров.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
есть такой вопрос, хочу сделать UPDATE запрос к базе данных, для этого нужно подготовить запрос, но помимо подстановки данных, я хочу подставить...
есть указатель на массив объектов s и указатель на s
Есть такой код, которые считает свободное место на диске: