C++迭代器iterator遍历

iterator是通用的遍历容器的方式

通用模板

anySet <a...> as;
anySet <a...>::iterator it = as.begin();
for (; it != as.end(); it++)
{
    cout <<(*it);//即迭代器it指向的元素
}

四种迭代器

  1. 正向迭代器,定义方法如下:
    容器类名::iterator 迭代器名;

  2. 常量正向迭代器,定义方法如下:
    容器类名::const_iterator 迭代器名;

  3. 反向迭代器,定义方法如下:
    容器类名::reverse_iterator 迭代器名;

  4. 常量反向迭代器,定义方法如下:
    容器类名::const_reverse_iterator 迭代器名;

功能分类

  1. 正向迭代器。假设 p 是一个正向迭代器,则 p 支持以下操作:++p,p++,*p。此外,两个正向迭代器可以互相赋值,还可以用==和!=运算符进行比较。

  2. 双向迭代器。双向迭代器具有正向迭代器的全部功能。除此之外,若 p 是一个双向迭代器,则--p和p--都是有定义的。--p使得 p 朝和++p相反的方向移动。

  3. 随机访问迭代器。随机访问迭代器具有双向迭代器的全部功能。若 p 是一个随机访问迭代器,i 是一个整型变量或常量,则 p 还支持以下操作:
    p+=i:使得 p 往后移动 i 个元素。
    p-=i:使得 p 往前移动 i 个元素。
    p+i:返回 p 后面第 i 个元素的迭代器。
    p-i:返回 p 前面第 i 个元素的迭代器。
    p[i]:返回 p 后面第 i 个元素的引用。

    此外,两个随机访问迭代器 p1、p2 还可以用 <、>、<=、>= 运算符进行比较。p1<p2的含义是:p1 经过若干次(至少一次)++操作后,就会等于 p2。其他比较方式的含义与此类似。

    对于两个随机访问迭代器 p1、p2,表达式p2-p1也是有定义的,其返回值是 p2 所指向元素和 p1 所指向元素的序号之差(也可以说是 p2 和 p1 之间的元素个数减一)。

    不同容器的迭代器的功能

    容器 迭代器功能
    vector 随机访问
    deque 随机访问
    list 双向
    set / multiset 双向
    map / multimap 双向
    stack 不支持迭代器
    queue 不支持迭代器
    priority_queue 不支持迭代器

对于双向访问容器

  • 取双向链表节点的前驱和后继

    • //获取一个距离 it 迭代器 2 个元素的迭代器,由于 2 为正数,newit 位于 it 左侧
      auto newit = prev(it, 2);
      
    • //获取一个距离 it 迭代器 2 个元素的迭代器,由于 2 为正数,newit 位于 it 右侧
      auto newit = next(it, 2);
      
  • 将迭代器前进(或者后退)指定长度的距离

    • advance(it, 2);
      
posted @ 2023-10-23 16:49  加固文明幻景  阅读(129)  评论(0编辑  收藏  举报