C++STL迭代器特性(Iterator Traits)

我们都知道迭代器可以区分为不同类型,每个类型都具有特定的迭代器功能。如果我们根据迭代器的不同类型,重载操作行为,将会很有用。

充当中间层的作用回答算法提出的问题:算法------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;
}
原创文章 23 获赞 1 访问量 361

猜你喜欢

转载自blog.csdn.net/weixin_44806268/article/details/105691217