i == j does not imply ++i == ++j.
 Every iterator in a valid range [i, j) is dereferenceable, and j is either dereferenceable or past-the-end. The fact that every iterator in the range is dereferenceable follows from the fact that incrementable iterators must be deferenceable.
 After executing ++i, it is not required that copies of the old value of i be dereferenceable or that they be in the domain of operator==.
 It is not guaranteed that it is possible to pass through the same input iterator twice.