关于iterator_traits的使用

iterator是算法和容器的桥梁,但是几乎所有的容器在定义iterator的时候都会有iterator traits这个函数,我们今天就来聊一下iterator traits。

  一、为什么要有iterator?

  二、Iterator的特性

  三、Iterator里面包含的内部结构

  四、为什么要有iterator_traits

  五、Iterator traits的实现源码

  六、总结

  一、为什么要有iterator?

    首先我们知道,整个STL容器是由容器和算法两部分组成的,那么开发这两部分人是不一样的(这样比较节省效率),为了解决这个问题,那么容器和算法之间需要添加一个粘合剂,这个东西就叫做iterator。

  二、iterator的特性

    Iterator到底是什么呢?我们可以把它理解成一个智能指针,当然了这不是说它能够自动释放,而是它封装了一层指针。

  三、iterator里面所包含的内部结构

    首先,正如我前面所说的,iterator最终是给算法用的,换句话说iterator里面包含什么元素取决于算法到底要什么?那么算法到底要什么呢?首先它肯定需要知道类型,以及容器类型(有的是双向,有的是随机),以及范围,所以我们针对这些设计iterator的内容。

    

template<typename _Tp>

    struct _List_iterator

    {

      typedef _List_iterator<_Tp>         _Self;

      typedef _List_node<_Tp>             _Node;

   // iterator

      typedef ptrdiff_t                   difference_type;

      typedef std::bidirectional_iterator_tag   iterator_category;

      typedef _Tp                   value_type;

      typedef _Tp*                        pointer;

      typedef _Tp&                        reference;

}

我们主要来看后面5个(前面两个是list所独有的) 

 typedef ptrdiff_t                   difference_type;

这个我们用来表示范围,即我们要确定我们要传进算法范围的内容是多少

 typedef std::bidirectional_iterator_tag   iterator_category;

 这个主要确定容器的选择,在容器的分类中,有单向容器,双向容器等等。那么list是一个双向容器

四、为什么要有iterator_traits

  为什么要有iterator_traits呢?因为如果我们传进去的是类或者类型自然没有问题,但是如果我们传入的是指针或者常量指针就比较麻烦了,为了解决这个问题,STL容器使用了泛化指针来解决这个问题

  

template<typename _Iterator>

    struct iterator_traits

    {

      typedef typename _Iterator::iterator_category iterator_category;

      typedef typename _Iterator::value_type        value_type;

      typedef typename _Iterator::difference_type   difference_type;

      typedef typename _Iterator::pointer           pointer;

      typedef typename _Iterator::reference         reference;

    };

#endif

  /// Partial specialization for pointer types.

  template<typename _Tp>

    struct iterator_traits<_Tp*>

    {

      typedef random_access_iterator_tag iterator_category;

      typedef _Tp                         value_type;

      typedef ptrdiff_t                   difference_type;

      typedef _Tp*                        pointer;

      typedef _Tp&                        reference;

    };

  /// Partial specialization for const pointer types.

  template<typename _Tp>

    struct iterator_traits<const _Tp*>

    {

      typedef random_access_iterator_tag iterator_category;

      typedef _Tp                         value_type;

      typedef ptrdiff_t                   difference_type;

      typedef const _Tp*                  pointer;

      typedef const _Tp&                  reference;

    };

 这就是iterator traits的用法。

原文地址:https://www.cnblogs.com/songyuchen/p/14357903.html