нет гарантии, что при повторном обходе контейнера с итератором ввода будут проходить значения в том же порядке. Также после увеличения итератора ввода нет гарантии того, что его предыдущее значение все еще может быть разыменовано.
или же
InputIterator — это итератор, который может читать из указанного элемента. InputIterators гарантируют действительность только для однопроходных алгоритмов: после увеличения InputIterator i все копии его предыдущего значения могут быть признаны недействительными.
почему все копии его предыдущего значения могут быть признаны недействительными? что такое концептуальное из этих утверждений?
Это говорит о том, что ваш итератор может читать только тот элемент, на который он указывает в данный момент, он не знает о предыдущих или следующих элементах.
Подумайте о наличии двух итераторов, указывающих на std::list<T>
Item1 ---> Item2 ---> Item3 ---> Item4
Iter0 ----↑ ↑
Iter1----------------ˈ
Представьте, что их нужно увеличивать следующим образом:
Iter0 = Iter1;
Iter1++;
После приращения ваш набор итераторов будет выглядеть так:
Item1 ---> Item2 ---> Item3 ---> Item4
Iter0 ------------------↑ ↑
Iter1------------------------------ˈ
Предыдущее значение Iter1
хранится в Iter0
поэтому он всегда указывает на элемент, предшествующий Iter1
,
Теперь представьте, что я выполняю удаление Item2
,
Item1 ---> Item3 ---> Item4
Iter0 -??? ↑
Iter1-------------------ˈ
Iter1
все еще действует и указывает на Item3
,
Iter0
который был предыдущим значением Iter1
больше не действителен и указывает на «ничто» (то есть разыменование этого итератора теперь будет считаться неопределенным поведением).
Других решений пока нет …