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

    一、迭代器分类
    1.输入迭代器(只能从序列容器中读取数据不能向其中写入数据
    • 如输入流迭代器:istream_iterator<T>

    2.输出迭代器(只能向序列容器中写入数据不能从其中读取数据,不要求定义==和!=)
    • 如输出流迭代器ostream_iterator<T> out(输出流对象,字符串),向输出流中写入数据时,将字符串插入到各个数据之间

    3.前代器
    • 既是输入迭代器,同时又是输出迭代器,同时支持数据读取和写入。并且可以对序列进行单方向遍历;可以保存一个前向迭代器,并利用它从同一个位置重新遍历,一次支持多遍扫描算法。
    • replace算法(必须满足前向迭代器的条件):replace(first_iterator , last_iterator , const T& x , const T &y),将容器[first,last)区间内素有等于x的值用y替代,时间复杂度为O(N),但first_iterator和last_iterator必须满足前向迭代器的条件
    • 数组、链表list、双端队列deque均满足双端队列的条件;

    4.双向迭代器
    • 具有单向迭代器所有功能&&可以在两个方向遍历数据(支持序列反向遍历)
    • 必须定义前缀和后缀++ 和--操作,时间复杂度均为常量;
    • reverse算法(必须满足双向迭代器的条件):reverse(start,end),翻转[start,end)区间内所有元素;
    • 链表list(双链表)满足双向迭代器的条件。

    5.随机访问迭代器
    • 支持双向迭代器所有功能&&整数的加法和减法操作,r+n,r-n,n+r等&&使用表达式r[n]访问容器中第n个元素&&双向“跳转”,以r+=n和r-=n表示;迭代器减法,以r-s表示;比较,以r<s,r>s,r<=s,r>=s表示,结果为bool;
      注:r和s均为随机访问迭代器;n为整数;

    6.STL迭代器的层次结构:算法和容器之间的高效结合
    • 输入/输出迭代器—>前向迭代器—>双向迭代器—>随机访问迭代器
    • list是双向迭代器;
    • find算法要求输入迭代器
    • sort算法要求随机访问迭代器
    • deque提供了随机访问迭代器
    • set提供了双向迭代器
    • merge算法要求输入迭代器或更高级的迭代器

    7.插入迭代器(将类属算法转入到“插入模式”)
    • back_insert_iterator<Container>:使用Container的push_back成员函数,适用于vector,list,deque等类型的容器(它们都提供了push_back成员函数)
    • front_insert_iterator<Container>:使用Container的push_front成员函数,有线性复杂度,vector无法提供push_front成员函数,因此该迭代器不适用于vector;
    • insert_iterator<Container>:使用Container的insert成员函数,最为普通的插入迭代器,允许在容器任意位置插入数据;可用于任何类型的容器(因为任何容器均提供了insert(iterator,value)成员函数)
    • 注:这种插入操作使容器扩展已分配内存空间,赋值操作要求必须实现存在已分配内存保存结果。
    对应函数:
    • back_inserter(Container c):同back_insert_iterator<Container>(Container c)
    • front_inserter(Container c):同front_insert_iterator<Container>(Container c)
    • inserter(Container c):对应于insert_iterator<Container>(Container c)
  • 相关阅读:
    必须要狠狠的喷一把苹果
    机械键盘四种轴试用体验
    linux终端快捷键
    挥别我在软件开发的第一个公司
    mysql 查询优化
    oracle 用户创建这个挺靠谱
    重置了下系统好多关于mysql密码的文章都很渣拷分好的备用
    关于WebView的复习
    Bpmx实施经验
    使用Nexus私服代理其他maven仓库(jitpack、jcenter)
  • 原文地址:https://www.cnblogs.com/cyjsegull/p/4526301.html
Copyright © 2011-2022 走看看