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