std::iterator_traits
来自cppreference.com
在头文件 <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
是类型特征类,为迭代器类型的属性提供统一的接口,使得能够仅针对迭代器实现算法。
该类定义了如下类型,与 std::iterator 中的类型定义相对应:
-
difference_type
- 可用来标示迭代器间距的类型 -
value_type
- 迭代器解除引用后所得到的值的类型。对输出迭代器而言,该类型为void
。 -
pointer
- 指向被迭代类型(value_type
)的指针 -
reference
- 被迭代类型(value_type
)的引用类型 -
iterator_category
- 迭代器分类。必须是迭代器分类标签之一。
可以针对用户自定义迭代器特化该模版,这样,即便该类型没有提供一般的类型定义,也能获取关于该迭代器的信息。
目录 |
[编辑] 模版参数
Iterator | - | 需要取得与之相关属性的迭代器类型 |
[编辑] 成员类型
成员类型 | 定义 |
difference_type
|
Iterator::difference_type
|
value_type
|
Iterator::value_type
|
pointer
|
Iterator::pointer
|
reference
|
Iterator::reference
|
iterator_category
|
Iterator::iterator_category
|
[编辑] 特化
如果要把用户提供的类型作为迭代器使用,该类型特征可以针对这一类型进行特化。标准库中提供了针对指针类型 T *
的两种偏特化,使得可以在任何需要迭代器的算法里使用裸指针。
[编辑] 针对 T *
特化的成员类型
成员类型 | Definition |
difference_type
|
std::ptrdiff_t |
value_type
|
T
|
pointer
|
T*
|
reference
|
T&
|
iterator_category
|
std::random_access_iterator_tag |
[编辑] 针对 const T *
特化的成员类型
成员类型 | 定义 |
difference_type
|
std::ptrdiff_t |
value_type
|
T
|
pointer
|
const T*
|
reference
|
const T&
|
iterator_category
|
std::random_access_iterator_tag |
[编辑] 示例
针对双向迭代器的通用 reverse()
实现
#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 }
输出:
5 4 3 2 1 5 4 3 2 1
[编辑] 相关条目
基本的迭代器 (类模板) | |
空类类型用来表示迭代器类别 原文: empty class types used to indicate iterator categories (类) |