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