zoukankan      html  css  js  c++  java
  • C++STL迭代器

    自C++11起,我们就可以使用一个range-based for循环来处理所有的元素。这使人们意识到,我们需要一个”能够迭代某序列(sequence)内所有元素”的对象,这个对象就是迭代器,你也可以理解为,通过迭代器这个对象,可以表现出容器元素的位置。

    迭代器的功能

    1.指向容器中的元素,类似于指针。

    2.作为容器与算法的媒介,也可以称作粘合剂。

    迭代器的头文件

    所有容器都定义有自己的iterator类型,在平时使用某种容器的iterator时,不必包含什么特殊的头文件。但一些特殊的iterator以及若干辅助的iterator函数,它们被定义于头文件<iterator>中,所以你要是想实现iterator的完整功能,必须要加上该头文件

    #include<iterator>

    迭代器的种类(按功能分类)

    1.forward(前向) 迭代器

    forward 迭代器使一种input 迭代器且再前进读取(reading forward)时提供额外保证。

    允许操作

    *iter          //访问实际元素
    iter->member   //访问实际元素的成员member
    ++iter         //向前步进(返回新位置)
    iter++         //向前步进(返回旧位置)
    iter1==iter2   //判断两个迭代器是否相等
    iter1!=iter2   //判断两个迭代器是否不等
    iter1=iter2    //对迭代器赋值

    2.bidirectional(双向) 迭代器

    bidirectional 迭代器在forward 迭代器的基础上增加了回头迭代的能力,它支持递减操作符,可一步一步的后退。

    --iter     //步退,返回新位置
    iter--     //步退,返回旧位置

    3.random-access(随机访问) 迭代器

    random-access 迭代器在bidirectional 迭代器基础上增加了随机访问能力,有了一系列新增操作

    iter[n]              //访问索引位置为n的元素
    iter+=n              //前进n个元素
    iter-=n              //回退n个元素
    iter+n               //返回iter之后的第n个元素
    n+iter               //返回iter之后的第n个元素
    iter-n               //返回iter之前的第n个元素
    iter1-iter2          //返回iter1和iter2之间的距离
    iter1<iter2          //判断iter1是否在iter2之前
    iter1>iter2          //判断iter1是否在iter2之后
    iter1<=iter2         //判断iter1是否不在iter2之后
    iter1>=iter2         //判断iter1是否不在iter2之前

    迭代器按定义方式有以下4种

    1.正向迭代器

    容器类名::iterator  迭代器名;

    2.反向迭代器

    容器类名::reverse_iterator  迭代器名;

    3.常量正向迭代器

    容器类名::const_iterator  迭代器名;

    4.常量反向迭代器

    容器类名::const_reverse_iterator  迭代器名;

    迭代器相关辅助函数

    1.advance

    advance()可将迭代器的位置增加,增加幅度由实参决定。

    #include<iterator>
    void advance(InputIterator& pos,Dist n)

    令名称为pos的input迭代器前进(或后退)n个元素,Dist是个template类型,通常它必须是个整形。注意,该操作并不检查迭代器是否超过序列的end()。

    该函数会根据迭代器种类采用最佳方案,最快为常量复杂度,最慢为线性复杂度。

    使用实例

    #include<iostream>
    #include<list>
    #include<iterator>
    using namespace std;
    int main()
    {
         list<int> c={1,2,3,4,5,6,7,8,9};
         list<int>::iterator pos=c.begin();
         cout<<*pos<<endl;
         advance(pos,3);
         cout<<*pos<<endl;
         advance(pos,-1);
         cout<<*pos<<endl;
         return 0;
    }

    2.distance

    distance()函数用来处理两个迭代器之间的距离。

    #include<iterator>
    Dist distance(InputIterator pos1, InputIterator pos2)

    返回两个input迭代器pos1和pos2之间的距离。

    注意:两个迭代器必须指向同一容器。且若不是random-access 迭代器,则从pos1开始必须要能达到pos2。返回类型是迭代器相应的类型。

    该函数对于非随机访问迭代器效能并不是很好,应该避免使用。

    使用实例

    #include<iostream>
    #include<list>
    #include<iterator>
    #include<algorithm>
    using namespace std;
    int main()
    {
         list<int> c={-3,-2,-1,0,1,2,3,4,5,6,7,8,9};
         list<int>::iterator pos;
         pos=find(c.begin(),c.end(),5);
         if(pos!=c.end())
         {
             cout<<"distance between beginning and 5: "
                 <<distance(c.begin(), pos)<<endl;
         }else
         {
             cout<<"5 not found"<<endl;
         }
         return 0;
    }

    find()后,数值为5的元素的位置被赋值给pos,然后distance()计算出pos与起点之间的距离。

    3.iter_swap

    一个简单的辅助函数,用来交换两个迭代器所指的元素值。

    #include<algorithm>
    void iter_swap(ForwardIterator1 pos1,ForwardIterator2 pos2)

    迭代器的类型不必相同,但其所指的两个值必须可以相互赋值。

    反向迭代器

    严格的来说,反向迭代器是一种迭代器适配器,该特殊迭代器能让算法以反向模式进行操作。

    所有标准容器都支持反向迭代器,你可以理解为,反向迭代器把正常迭代器的操作都颠倒过来了。

    容器的成员函数rbegin()和rend()各返回一个reverse 迭代器,共同定义出一个反向的迭代区间。

  • 相关阅读:
    企业级云数据库最佳实践
    NLP带来的“科幻感”超乎你的想象
    大咖来了:共话人工智能技术新生态
    2020年以后...软件开发人员趋势为何?
    云计算从入门到入行-专业培训认证课程限时0元领取
    linux 安装java jdk
    hadoop 配置信息记录
    hadoop 部署在centos 7 上
    centos 7 安装jdk
    Hadoop 集群ssh免密登录设置
  • 原文地址:https://www.cnblogs.com/cloudplankroader/p/10459513.html
Copyright © 2011-2022 走看看