std::iterator_traits
From cppreference.com
                    
                                        
                    
                    
                                                            
                    |   Defined in header <iterator>
   | 
||
|   template< class Iterator> struct iterator_traits;  | 
||
|   template< class T > struct iterator_traits<T*>;  | 
||
|   template< class T > struct iterator_traits<const T*>;  | 
||
std::iterator_traits is the type trait class that provides uniform interface to the properties of iterator types. This makes it possible to implement algorithms only in terms of iterators.
Contents | 
[edit] Member types
| Member type | Definition | 
| difference_type | Iterator::difference_type | 
| value_type | Iterator::value_type | 
| pointer | Iterator::pointer | 
| reference | Iterator::reference | 
| iterator_category | Iterator::iterator_category | 
[edit] Specializations
This type trait may be specialized for user-provided types that may be used as iterators. The standard library provides two partial specializations for pointer types T*, which makes it possible to use all iterator-based algorithms with raw pointers.
[edit] T* specialization member types
| Member type | Definition | 
| difference_type | std::ptrdiff_t | 
| value_type | T | 
| pointer | T* | 
| reference | T& | 
| iterator_category | std::random_access_iterator_tag | 
[edit] const T* specialization member types
| Member type | Definition | 
| difference_type | std::ptrdiff_t | 
| value_type | T | 
| pointer | const T* | 
| reference | const T& | 
| iterator_category | std::random_access_iterator_tag | 
[edit] Example
general-purpose reverse() implementation for bidirectional iterators
#include <iostream> #include <iterator> #include <vector> #include <list> template<class BDIter> void my_reverse(BDIter first, BDIter last) { typename std::iterator_traits<BDIter>::difference_type n = std::distance(first, last); --n; while(n > 0) { typename std::iterator_traits<BDIter>::value_type tmp = *first; *first++ = *--last; *last = tmp; n -= 2; } } int main() { std::vector<int> v{1,2,3,4,5}; my_reverse(v.begin(), v.end()); for(int n : v) std::cout << n << ' '; std::cout << '\n'; std::list<int> l{1,2,3,4,5}; my_reverse(l.begin(), l.end()); for(auto n : l) std::cout << n << ' '; std::cout << '\n'; // std::istreambuf_iterator<char> i1(std::cin), i2; // my_reverse(i1, i2); // compilation error }
Output:
5 4 3 2 1 5 4 3 2 1
[edit] See also
|    the basic iterator   (class template)  | |
|    empty class types used to indicate iterator categories  (class)  | |