我们都知道迭代器可以区分为不同类型,每个类型都具有特定的迭代器功能。如果我们根据迭代器的不同类型,重载操作行为,将会很有用。
充当中间层的作用回答算法提出的问题:算法------iterator traits--------迭代器
C++标准库的五种迭代器 | iterator tag |
---|---|
输出迭代器 | output_iterator_tag |
输入迭代器 | input_iterator_tag |
前向迭代器 | forward_iterator_tag |
双向迭代器 | bidirectional_iterator_tag |
随机存取迭代器 | random_access_iterator_tag |
template<class T> //T表示迭代器的型别
struct iterator_traits
{
//指迭代器所指对象的型别
typedef typename T::value_type value_type;
//用来表示两个迭代器之间的距离的型别
typedef typename T::difference_type difference_type;
//迭代器的tag分类
typedef typename T::iterator_category iterator_category;
typedef typename T::pointer pointer;
typedef typename T::reference reference;
};
对于一般指针作为迭代器的特化版本
template<class T>
struct iterator_traits<T*>
{
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef random_access_iterator_tag iterator_category;
typedef T* pointer;
typedef T& reference;
};
例子----运用迭代器型别 实作distance()
针对随机存取迭代器版本,可以使用随机存取操作。针对双向迭代器则不可以。
template<class iterator>
typename iterator_traits<iterator>::difference_type distance(iterator iter1,iterator iter2)
{
return distance(iter1,iter2,iterator_traits<iterator>::category());
}
//随机存取迭代器版本
template<class iterator>
typename iterator_traits<iterator>::difference_type
distance(iterator iter1,iterator iter2,random_access_iterator_tag)
{
return iter2-iter1;
}
//非随机存取迭代器版本---例如双向迭代器版本
template<class iterator>
typename iterator_traits<iterator>::difference_type
distance(iterator iter1,iterator iter2,bidirectional_iterator_tag)
{
typename iterator_traits<iterator>::difference_type itersize=0;
while(iter1!=iter2)
{
++itersize;
++iter1;
}
return itersize;
}