Итератор представляет позицию в последовательности элементов.Итератор знает, как перейти к следующему элементу в этой последовательности, но природа модели итератора в C ++ основана на идее, что после конца такой последовательности существует итератор «за концом конца».Такой итератор не представляет допустимый элемент в последовательности;это просто представляет конец последовательности, и итераторы могут быть проверены против него.
Эта конструкция полезна, поскольку она позволяет вам говорить о поддиапазонах элементов в последовательности.Например, если контейнер содержит 10 элементов, вы можете передать итераторы begin/end
алгоритму std::sort
, чтобы отсортировать их.Однако вы также можете отсортировать первые 10 элементов, передав итератор begin
и итератор begin() + 10
в одну и ту же функцию.Алгоритм sort
будет трактовать данный конечный итератор как итератор «за конец», а не как итератор действительного элемента.
То, что вы пытаетесь сделать, - это объединить две разные идеи: положение испектр.Некоторые итерационные модели работают таким образом, но это не модель, основанная на STL, на которой основана стандартная библиотека C ++.
Теперь, чтобы быть справедливым, в некоторых случаях позиция по своей природе несет информацию о диапазоне.Итераторы на основе stream
знают, находятся ли они в конце потока или нет, потому что для функционирования в качестве итератора они должны хранить ссылку на поток, по которому они перебираются.И поток знает, нет ли у него данных.Но в целом, один итератор не предназначен для того, чтобы знать, находится ли он в конце своего диапазона или нет.