Because standard library iterator categories are hierarchical, each category includes all the requirements of the categories above it. Because iterators are used to traverse and access containers, the nature of the container determines what type of iterator it generates. And, because algorithms require specific iterator types as arguments, it is iterators that, for the most part, determine which standard library algorithms can be used with which standard library containers. Every iterator type guarantees that there is an iterator value that points past the last element of a corresponding container. No guarantee is made that this value is dereferencable.
Every function provided by an iterator is required to be realized in amortized constant time.
Algorithms using input iterators should be single pass algorithms. That is they should not pass through the same iterator twice. The value of type T does not have to be an lvalue . Algorithms using output iterators should be single pass algorithms. That is they should not pass through the same iterator twice.