zoukankan      html  css  js  c++  java
  • 关于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的用法。

  • 相关阅读:
    Redis学习
    MySQL索引
    细数 Java 线程池的原理
    红黑树学习
    HashMap学习
    Java集合框架
    Java性能优化的45个细节
    MyBatis理解
    jenkins+git+maven+tomcat+jdk本地部署windows版
    windows版docker安装nginx,并设置目录挂载
  • 原文地址:https://www.cnblogs.com/songyuchen/p/14357903.html
Copyright © 2011-2022 走看看