Обход контейнера во второй раз с помощью итератора ввода

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

или же

InputIterator — это итератор, который может читать из указанного элемента. InputIterators гарантируют действительность только для однопроходных алгоритмов: после увеличения InputIterator i все копии его предыдущего значения могут быть признаны недействительными.

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

0

Решение

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

Подумайте о наличии двух итераторов, указывающих на 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 больше не действителен и указывает на «ничто» (то есть разыменование этого итератора теперь будет считаться неопределенным поведением).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]