STL分析(四 iterator traits)

iterator遵循的设计原则

由于iterator是关联Contrainer和algorithms的纽带,当algorithms想要通过iterator处理元素时,有几个问题需要Iterator回答给algorithms。

  • iterator指向元素类型
  • iterator的类别
  • iterator的差的类型
template<typename _ForwardIterator>
    inline void
    rotate(_ForwardIterator __first,
           _ForwardIterator __middle
           _ForwardIterator __last)
    {
    ......
    std::__rotate(__first, __middle, __last,
                  std::__iterator_catagory(__first));
    }
 
 
template<typename _Iter>
    inline typename iterator_traits<_Iter>::iterator_category
    __iterator_category(const _Iter&)
    { return typename iterator_traits<_Iter>::iterator_category(); }
 
 
template<typename _RandomAccessIterator>
    void
    __rotate(_RandomAccessIterator __first,
             _RandomAccessIterator __middle,
             _RandomAccessIterator __last,
             random_access_iterator_tag)
{
......
    typedef typename iterator_traits<_RandomAccessIterator>::difference_type _Distance;
    typedef typename iterator_traits<_RandomAccessIterator>::value_type _ValueType;
    _Distance __n = __last - __first;
    _Distance __k = __middle - __first;
......
}

在这里插入图片描述
假如传给algorithms的是native pointer,则需要引入iterator traits,统一处理class iterator和native iterator
在这里插入图片描述
下面是iterator_traits源代码

template<class I>
struct iterator_traits{
    typedef typename I::iterator_category    iterator_category;
    typedef typename I::value_type           value_type;
    typedef typename I::difference_type      difference_type;
    typedef typename I::pointer              pointer;
    typedef typename I::reference            reference;
};
 
 
//partial specialization for regular pointers
template<class T>
struct iterator_traits<T*>{
    typedef random_access_iterator_tag    iterater_category;
    typedef T                             value_type;
    typedef ptrdiff_t                     difference_type;
    typedef T*                            pointer;
    typedef T&                            reference;
};
 
//partial specialization for regular const pointers
template<class T>
struct iterator_traits<const T*>{
    typedef random_access_iterator_tag    iterater_category;
    typedef T                             value_type;
    typedef ptrdiff_t                     difference_type;
    typedef const T*                      pointer;
    typedef const T&                      reference;
};

对于传入的native pointer情况进行偏特化,注意const* T的偏特化版本中value_type是T而不是const T,因为value_type是为了声明变量,而声明一个无法赋值的变量没有用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值