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)
posted @ 2015-05-24 16:45  cyjseagull  阅读(365)  评论(0编辑  收藏  举报