3-4 C++迭代器初步
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
注意:
如果p是指向结构体的指针,
p->member表示取出指针p所指向的结构体对象的成员member,等价于(*p).member【和迭代器的语法一致。】迭代器指向的对象的成员可能是数据成员,也可能是函数成员
//如果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读取指向对象的值,无法修改
看几个典型情况
- const容器的
.beigin()和.end()的迭代器类型是xxx::const_iterator - 非const容器的
.beigin()和.end()的迭代器类型xxx::iterator - 如果const容器需要使用const类型的迭代器,可以这么写
x.cbegin()和x.cend()。x.cbegin()++的类型仍是const.
使用迭代器时的注意点
- 在范围for内不要改变容器大小【如进行
push_back()操作】 - 在使用迭代器时,也不要改变容器大小【如进行
push_back()操作】
3.4.2 迭代器的算术操作
常见操作

典型案例:二分查找
注意,auto mid = (beg + end) /2是错误写法,两迭代器的相加运算式未定义的

3-4 C++迭代器初步的更多相关文章
- python初步学习-生成式、生成器、迭代器、装饰器
生成式 列表生成式 字典生成式 集合生成式 嵌套列表生成式 列表生成式 列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理.语法格式为 ...
- python协程初步---一个迭代器的实现
一般认为迭代器就是实现了两个方法__iter__和__next__ 先创建这样一个类 from collections import Iterable from collections import ...
- python多重继承的属性和方法调用顺序问题和对迭代器的初步理解
推荐阅读:https://www.cnblogs.com/bigb/p/11650707.html 计算机学习的一个好办法就是自己将代码跑一遍,了解代码的运作顺序和原理(主要弄懂 函数作用,传入参数, ...
- python学习笔记之迭代器和函数(第三天)
一.collection系列: 1.counter计数器 如果counter(dict)是对字典的一个补充,如果counter(list)则是对列表的补充,初步测试对字典的值进行排序. ####### ...
- (十七)迭代器模式详解(foreach的精髓)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,很久没以LZ的身份和 ...
- python函数(5):迭代器和生成器
迭代器和生成器是函数中的一大重点,务必掌握,何为迭代?何为迭代器? 预习: 处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕 一.迭代器 for i in 50: pr ...
- 设计模式之迭代器模式详解(foreach的精髓)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,很久没以LZ的身份和 ...
- Python迭代器详解
最近在看两个github项目的代码时对迭代器有些困惑,因此写一篇笔记以理清脉络,经过两天的修改完善对迭代器有了一个初步的理解,相信会比网上绝大多数笔记有用些. 一.基础概念 在进行具体的迭代类和迭代函 ...
- Python内置类型(5)--迭代器类型
指能够被内置函数next调用并不断返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值的对象称为迭代器(Iterator) 其实以上的说法只是侠义上的迭代器的定义,在pyt ...
- LinQ的初步学习与总结
嘿嘿,说起来ORM和LinQ,就感觉离我好遥远的,在学校是没有学习的,所以总感觉学习了LinQ就是大神,现在嘛,终于也体会一点,感觉LinQ只是初步学习,没有太难,当然以后使用在项目中就没有这样的简单 ...
随机推荐
- 浅谈Integer缓存机制原理
面试题引入 这里引申出一个经典问题,看下面代码 Integer a = 100; Integer b = 100; System.out.println(a == b);//true Integer ...
- 如何选择 Linux 发行版
简介 要建立云服务器,首先需要安装操作系统.在现代环境中,几乎所有情况下都是指 Linux 操作系统.从历史上看,Windows 服务器和其他类型的 Unix 在特定的商业环境中都很流行,但现在几乎每 ...
- [Udemy] AWS Certified Data Analytics Specialty - 6.Security
S3 加密 SSE-S3 SSE-KMS SSE-C Client Side Encryption SSL/TLS S3 支持http/https 两种协议 KMS KMS最大能加密4KB的数据,再大 ...
- 模N取余法实现大整数进制转换 ——C语言版(2-16进制均可)
思路如标题所说采用模N取余法,难点是这个除法过程如何实现. 个人推荐先到这篇博客学习一下,大佬的思路就是不一样:大数除法--超详细讲解 我所做的就是在上面博文代码的基础上增加了循环,用一个字符数组逆序 ...
- Qt 中实现异步散列器
[写在前面] 在很多工作中,我们需要计算数据或者文件的散列值,例如登录或下载文件. 而在 Qt 中,负责这项工作的类为 QCryptographicHash. 关于 QCryptographicHas ...
- HTML & CSS – Styling List
前言 ul > li 经常会用到, 它原本的 style 很丑, 这篇介绍如果修改它. 以前学 W3Schools 的时候也有记入过: HTML – W3Schools 学习笔记 参考: You ...
- ASP.NET Core 单元测试
前言 单元测试是好, 但是也很花时间. 有些功能封装好了以后也不怎么会再打开, 所以通常就是徒手测试一下, 过了就过了. 但是往往就是那么神奇, 就是会有需求漏掉. 后来要加, 又由于不想潜水, 对自 ...
- 前置机器学习(二):30分钟掌握常用Jupyter Notebook用法
相较于Pycharm执行py文件来说,Jupyter Notebook可保存执行过程,添加图表.注释等富文本说明的功能,使其对机器学习的开发者格外友好. 本文包含机器学习环境安装,Jupyter No ...
- 数据库排行榜|当 DB-Engines 遇见墨天轮国产数据库排行
提到数据库排名,此时脑海里浮现出的是什么?是 DB-Engines,还是墨天轮数据库排行?两者间有什么区别?下面来聊一下业内这两个知名数据库排名平台. 本篇文章约有 3000 字,预计阅读时间 7 分 ...
- CSharp的@microsoft/signalr实时通信教程 - 前端 vue
1. 安装@microsoft/signalr pnpm install @microsoft/signalr --save signalr 是微软对 websocket技术的封装,优化了操作 :1. ...