The Standard Template Library defines five major categories of iterators. The following diagram illustrates these categories:input iterators output iterators / forward iterators | bidirectional iterators | random access iteratorsNote that this illustration doesn’t represent inheritance relationships; it merely describes the iterator categories and their interfaces. Each lower category is a superset of the category above it. For instance, a forward iterator provides the functionality of input and output iterators plus additional functionality. Here is a brief summary of the functionality and interfaces of these categories:
- Input iterators allow the user to advance the iterator (by using the ++) and read the value to which the iterator points (using the * operator).
- Output iterators allow the user to advance the iterator and assign a new value to the object to which the iterator is pointing.
- Forward iterators support both read and write access, but traversal is permitted only in one direction.
- Bidirectional iterators allow the user to traverse the sequence in both directions. In other words, you can use both ++ and?with a bidirectional iterator.
- Random access iterators support random jumps and pointer arithmetic operations. For example:
string::iterator it = s.begin();char c = *(it+5); // skip five elements in a sequence