The iterator type must be a model of . An input iterator is an iterator that can read through a sequence of values. It is single-pass (old values of the iterator cannot be re-used), and read-only. An input iterator represents a position in a sequence. Therefore, the iterator can point into the sequence (returning a value when dereferenced and being incrementable), or be off-the-end (and not dereferenceable or incrementable). The value type of the iterator (not necessarily what *i returns) The difference type of the iterator The category of the iterator i is incrementable (not off-the-end) i is incrementable (not off-the-end) i is incrementable (not off-the-end) Equivalent to (void)(++i) i is dereferenceable or off-the-end i is incrementable (not off-the-end) Equivalent to {value_type t = *i; ++i; return t;} i is dereferenceable or off-the-end All iterator operations must take amortized constant time.