美文网首页Effective STL学习笔记程序员
Effective STL 学习笔记 —— Part 4.迭代器

Effective STL 学习笔记 —— Part 4.迭代器

作者: JeremyYv | 来源:发表于2019-11-30 14:08 被阅读0次

    第四章. 迭代器


    • 条款26.iterator优先于const_iterator、reverse_iterator及const_reverse_iterator

    先说这四种迭代器各自的功能
    对iterator进行递增可以从容器头部遍历到尾部
    对reverse_iterator进行递增则可以从容器尾部遍历到头部
    const_iterator和const_reverse_iterator则是对这两种迭代器增加了常量性,不可改变迭代器指向的值
    再说它们之间的转换,为了直观一些我做了一张图

    四种迭代器之间的转换
    这四个迭代器是四个毫无关联的类(!!)。
    可以通过隐式转换,将非const转换为const,但const无法直接转换为非const(具体方法见下一条款)。
    至于非reverse和reverse之间转换,书上说非reverse可以隐式转换为reverse,但在vs2005的STL实现中,已经由explicit声明为非隐式转换了,需要将iterator传入reverse_iterator的构造函数转换为reverse迭代器而reverse转换为非reverse则可以通过迭代器调用base()获得
    最后可以说下这个条款了,为什么要优先使用iterator,避免使用其他三个
    容器类中的很多成员函数形参类型都是iterator,包括运算符重载函数,传入其他三个无法隐式转换为iterator类型的迭代器,将无法通过编译。而且混用不同类型迭代器,将导致模板函数在类型推导时产生意料之外的编译问题
    • 条款27.使用distance和advance将容器的const_iterator转换成iterator

    上一条款中提到,const_iterator无法直接转换为iterator
    如果想要转换,可以创建一个新的iterator,先将它指向begin(),然后计算const_iteratorbegin()之间的距离,再将新的迭代器移动相应距离,即可获得一个和const_iterator指向相同对象的iterator
    想法很简单很直接,实现通过distance()advance()这两个函数

    template<class InputIterator>
      typename iterator_traits<InputIterator>::difference_type
        distance (InputIterator first, InputIterator last);
        一长串的返回值可以忽略,这个函数返回两个迭代器之间的距离
    
    template <class InputIterator, class Distance>
      void advance (InputIterator& it, Distance n);
        将迭代器移动n个距离
    

    一起使用:

    const_iterator const_it = vec.begin();
    ...//经过某些操作
    iterator it = vec.begin();
    advance(it, distance<const_iterator>(it, const_it));
    

    ps.因为distance()进行类型推导时,迭代器实参需要类型一致,所以通过<const_iterator>指定模板推导类型iterator隐式转换为const_iterator


    • 条款28.正确理解由reverse_iterator的base()成员函数所产生的iterator的用法


    如有错误,欢迎指正

    相关文章

      网友评论

        本文标题:Effective STL 学习笔记 —— Part 4.迭代器

        本文链接:https://www.haomeiwen.com/subject/gzybwctx.html