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)  | 
|