2017-01-24 11 views
0

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

или

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

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

+3

Подумайте о 'std :: istream_iterator' с' std :: cin' – Jarod42

+0

Назовите свои источники, пожалуйста! Почему вы цитируете из книг, даже не упоминая их имена ?! –

ответ

0

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

Думает, имеющие два итератора, указывающие на std::list<T>

  Item1 ---> Item2 ---> Item3 ---> Item4 
Iter0 ----↑   ↑ 
Iter1----------------ˈ 

Представьте приращение их следующим образом:

Iter0 = Iter1; 
Iter1++; 

После приращения, ваш набор итераторов будет выглядеть следующим образом:

   Item1 ---> Item2 ---> Item3 ---> Item4 
Iter0 ------------------↑   ↑ 
Iter1------------------------------ˈ 

Предыдущее значение Iter1 is s обрабатывается в Iter0, поэтому он всегда указывает на элемент, предшествующий Iter1.

Теперь представьте, что я делаю удаление Item2.

   Item1 ---> Item3 ---> Item4 
Iter0 -???    ↑ 
Iter1-------------------ˈ 

Iter1 остается в силе и указывает на Item3.

Iter0, который был предыдущим значением Iter1, больше не действителен и указывает на «ничего» (что означает, что разыменование этого итератора теперь будет считаться неопределенным поведением).