C++ concepts: Iterator
From cppreference.com
                    
                                        
                    
                    
                                                            
                    The Iterator concept describes types that can be used to identify and traverse the elements of a container.
Iterator is the base concept used by other iterator types: InputIterator, OutputIterator, ForwardIterator, BidirectionalIterator, and RandomAccessIterator. Iterators can be thought of as an abstraction of pointers.
[edit] Requirements
The type It satisfies Iterator if
-  The type ItsatisfiesCopyConstructible, and
-  The type ItsatisfiesCopyAssignable, and
-  The type ItsatisfiesDestructible, and
-  lvalues of type ItsatisfySwappable, and
Given
-  r, an lvalue of typeIt,
-  reference, the type denoted by std::iterator_traits<It>::reference
The following expressions must be valid and have their specified effects:
| Expression | Return Type | Precondition | 
|---|---|---|
| *r | reference | ris dereferenceable (see below) | 
| ++r | It& | ris incrementable (see below) | 
[edit] Dereferenceable iterators
Iterators for which the behavior of the expression *i is defined are called dereferenceable.
Iterators are not dereferenceable if
- they are past-the-end iterators (including pointers past the end of an array) or before-begin iterators. Such iterators may be dereferenceable in a particular implementation, but the library never assumes that they are.
- they are singular iterators, that is, iterators that are not associated with any sequence. A null pointer, as well as a default-constructed pointer (holding an indeterminate value) is singular
- they were invalidated by one of the iterator-invalidating operations on the sequence to which they refer.
Iterators for which the behavior of the expression ++i is defined are called incrementable.


