3.4.0 为什么要有迭代器

为了遍历与处理容器(container)中的数据元素

因为不是所有容器向string和vector一样支持下标,但每种容器都支持用迭代器来实现遍历和随机访问

3.4.1使用迭代器

迭代器使用与指针类似,都指向一个对象,并都用解引用符*来取出指向的对象

迭代器指向容器中的对象或者末尾对象的下一个位置

每个支持迭代器的类都有两个基本的迭代器成员(member)

vector<int> v;
//(暂时先用auto 自动指定迭代器类型)
auto it1 = v.begin(); //头迭代器:指向v的第一个对象
auto it2 = v.end(); //尾末迭代器:指向v的最后一个对象的 下一个位置

v.begin() == v.end()说明容器为空

迭代器的比较操作

iter1 == iter2:iter1和iter2指向相同的对象,反之iter1 != iter2

需要注意的是:迭代器一定支持 == 与 != 的比较,但不一定支持 < 和 > 等比较

用迭代器写一个遍历

#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v = {1,2,3,4,5};
for(auto it = v.begin(); it != v.end(); it++) //it != v.end() 在此处也可写作 it < v.end()
cout<<*it<<endl;
return 0;
}

为什么写it != v.end()而不写 it < v.end()?

因为不是所有迭代器都定义了<比较符号

取出迭代器中的元素:解引用 *

  • *it:取出迭代器it所指的对象
  • it->member:取出迭代器it所指的对象的成员member,等价于(*it).member

注意:

  1. 如果p是指向结构体的指针p->member表示取出指针p所指向的结构体对象的成员member,等价于(*p).member【和迭代器的语法一致。】

  2. 迭代器指向的对象的成员可能是数据成员,也可能是函数成员

    //如果v存储的第一个string非空,则打印出来
    vector<string> v; //v中存储的对象是string
    auto it = v.begin();
    if(!it->empty()) //it指向string类的对象,it->empty()调用了该对象的函数成员
    cout<<*it<<endl;

迭代器的类型

以string的迭代器为例,迭代器有两种类型

  • string::iterator it:可以通过it读取和修改指向对象的值
  • string::const_iterator it:只能通过it读取指向对象的值,无法修改

看几个典型情况

  1. const容器的.beigin().end()的迭代器类型是xxx::const_iterator
  2. 非const容器的.beigin().end()的迭代器类型xxx::iterator
  3. 如果const容器需要使用const类型的迭代器,可以这么写x.cbegin()x.cend()x.cbegin()++的类型仍是const.

使用迭代器时的注意点

  1. 在范围for内不要改变容器大小【如进行push_back()操作】
  2. 在使用迭代器时,也不要改变容器大小【如进行push_back()操作】

3.4.2 迭代器的算术操作

常见操作

典型案例:二分查找

注意,auto mid = (beg + end) /2错误写法,两迭代器的相加运算式未定义的

3-4 C++迭代器初步的更多相关文章

  1. python初步学习-生成式、生成器、迭代器、装饰器

    生成式 列表生成式 字典生成式 集合生成式 嵌套列表生成式 列表生成式 列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理.语法格式为 ...

  2. python协程初步---一个迭代器的实现

    一般认为迭代器就是实现了两个方法__iter__和__next__ 先创建这样一个类 from collections import Iterable from collections import ...

  3. python多重继承的属性和方法调用顺序问题和对迭代器的初步理解

    推荐阅读:https://www.cnblogs.com/bigb/p/11650707.html 计算机学习的一个好办法就是自己将代码跑一遍,了解代码的运作顺序和原理(主要弄懂 函数作用,传入参数, ...

  4. python学习笔记之迭代器和函数(第三天)

    一.collection系列: 1.counter计数器 如果counter(dict)是对字典的一个补充,如果counter(list)则是对列表的补充,初步测试对字典的值进行排序. ####### ...

  5. (十七)迭代器模式详解(foreach的精髓)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,很久没以LZ的身份和 ...

  6. python函数(5):迭代器和生成器

    迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕 一.迭代器 for i in 50: pr ...

  7. 设计模式之迭代器模式详解(foreach的精髓)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,很久没以LZ的身份和 ...

  8. Python迭代器详解

    最近在看两个github项目的代码时对迭代器有些困惑,因此写一篇笔记以理清脉络,经过两天的修改完善对迭代器有了一个初步的理解,相信会比网上绝大多数笔记有用些. 一.基础概念 在进行具体的迭代类和迭代函 ...

  9. Python内置类型(5)--迭代器类型

    指能够被内置函数next调用并不断返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值的对象称为迭代器(Iterator) 其实以上的说法只是侠义上的迭代器的定义,在pyt ...

  10. LinQ的初步学习与总结

    嘿嘿,说起来ORM和LinQ,就感觉离我好遥远的,在学校是没有学习的,所以总感觉学习了LinQ就是大神,现在嘛,终于也体会一点,感觉LinQ只是初步学习,没有太难,当然以后使用在项目中就没有这样的简单 ...

随机推荐

  1. quartz监控日志(一)

    最近几个月,现网总是出现定时器不执行的情况,或者定时器卡死的情况,而又不方便排查,只能依靠quartz的debug日志以及错误日志来监控定时器的执行情况,并且随着我们系统中job越来越多,而使得job ...

  2. 首次在WebAPI中写单元测试

    xUnit 这次我使用的是xUnit测试框架,而不是VS自带的MSTest框架.在添加新建项目时选择xUnit测试项目就行了. 目前只体验到了一个差别,即xUnit可以使用特性向测试方法传参,而不用在 ...

  3. MySQL如何区分大小写

    MySQL CRUD 问题描述 mysql在Windows下是不区分大小写的,而Linux下区分大小写,Windows下将script文件导入MySQL后表名也会自动转化为小写,如果导入Linux服务 ...

  4. freertos总结

    freertos学习总结:(别人的)https://blog.csdn.net/qq_39397153/article/details/123997346 freertos学习笔记:(别人的)http ...

  5. tar 解压文件时提示 Ignoring unknown extended header keyword

    在 Linux 上使用 tar 解压文件时出现下列提示: tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.app ...

  6. WSL 使用

    WSL 是一个为在 Windows 10 和 Windows Server 2019 以上能够原生运行 Linux 二进制可执行文件(ELF 格式)的兼容层.可以把它当作一个只能用命令行交互的 Lin ...

  7. AI产品经理的探索:技能、机遇与未来展望

    Ai时代的产品经理 随着人工智能(AI)的飞速发展,AI已经从一个前沿技术概念逐步演变为驱动各行业创新的核心力量.从智能助手到自动驾驶,从个性化推荐系统到图像识别,AI正在以不可思议的速度改变着我们的 ...

  8. Drools与动态加载规则文件

    Drools与动态加载规则文件 Drools简介 对系统使用人员来说: 对开发人员来说: Drools架构图 快速开始 Drools简介 Drools是一款基于Java的开源规则引擎,将规则与业务代码 ...

  9. Ubuntu开机直接进入grub终极解决方法

    https://zhuanlan.zhihu.com/p/59062434 我遇到的问题是,每一步都操作没问题,但是开机还是会进入grub.最后只能进bios解决了. 我的服务器是supermicro ...

  10. Qt连连看(一)需求分析

    虽然开发经验并不多,但是结合以往的一点实践项目和理论学习,自认为不管是开发什么工程项目,只要遵循软件工程的构建原则,如选择一个合理的架构体系,再掌握一门语言,利用数据结构组织数据,算法实现想法和功能, ...