iterator迭代器的使用
部分摘自C++ Primer:
所有的标准库容器类都定义了相应的iterator类型,如vector:
vector<int>::iterator iter;
这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型。
理解一下:除了使用下标来访问vector对象的元素外,标准库还提供了另一种检测元素的方法:使用迭代器(iterator)。迭代器是一种允许程序员检查容器内元素,并实现元素遍历的数据类型。
vector <int>::iterator iter=vt.begin();//起始地址
vector <int>::iterator iter_end=vt.end();//结束地址
两个地址都是指针类型,end操作返回的迭代器指向vector的“末端元素的下一个”,指向了一个不存在的元素。若vector为空,begin和end返回的迭代器相同。由end操作返回的迭代器并不指向vector中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完vector中所有元素。
1.使用迭代器遍历vector元素:
vector<int> ivec(,);
for(vector<int>::iterator iter=ivec.begin();iter!=ivec.end();++iter)
{
*iter =; //使用 * 访问迭代器所指向的元素
}
vector<int>::const_iterator 和 const vector<int>::iterator有区别
const vector<int>::iterator newiter=ivec.begin();
*newiter=; //可以修改指向容器的元素
//newiter++; //迭代器本身不能被修改
2.迭代器基本操作:
iter++, ++iter, iter- -, --iter, iter+n, iter-n, iter1-iter2
3.注意伍是迭代器失效:
任何改变vector长度的操作都会使已存在的迭代器失效。例如,在调用push_back之后,就不能再信赖指向vector的迭代器的值了。
修改容器的内在状态或者移动容器内的元素,这样的操作使得所有指向被移动的元素的迭代器失效,也可能同时使得其他迭代器失效。
例如添加元素时,可能会导致容器的重新加载,这样该容器涉及的迭代器都将失效。即使不重新加载,指向新插入元素后面的那个元素的迭代器也会失效。
任何insert、push操作都可能导致迭代器失效,因此要确保迭代器每次循环后都得到更新。
vector<int>::iterator first = v.begin(),
last = v.end(); // cache end iterator
// Diaster: behavior of this loop is undefined
while (first != last) {
// do some processing
// insert new value and reassign first, which otherwise would be invalid
first = v.insert(first, );
++first; // advance first just past the element we added
}
上述代码的行为是未定义的。在很多实现中,该段代码将导致死循环。
问题在于这个程序将 end 操作返回的迭代器值存储在名为 last 的局部变量中。
循环体中实现了元素的添加运算,添加元素会使得存储在 last 中的迭代器失效。
该迭代器既没有指向容器 v 的元素,也不再指向 v 的超出末端的下一位置。
添加或删除 deque 或 vector 容器内的元素都会导致存储的迭代器失效。
所以,不要存储 end 操作返回的迭代器。
为了避免存储 end 迭代器,可以在每次做完插入运算之后重新计算 end 迭代器值:
// Safer: recalculate end on each trip whenever the loop adds/erases elements
while (first != v.end()) {
// do some processing
first = v.insert(first, ); // insert new value
++first; // advance first just past the element we added
}
自己的备注:
是否可以直接把iterator当成一个指针来看?
比如说
vector<int> v;
vector<int>::iterator iter;
// 其实里面的iterator 你可以这么理解typedef int* iterator;
// 是一个指向所属容器的指针
iter = v.begin()//指向v容器的第一个元素
可以对iter做增与减的操作
++iter;
--iter;
iterator迭代器的使用的更多相关文章
- ES6笔记(6)-- Set、Map结构和Iterator迭代器
系列文章 -- ES6笔记系列 搞ES6的人也是够无聊,把JS弄得越来越像Java.C++,连Iterator迭代器.Set集合.Map结构都出来了,不知道说什么好... 一.简单使用 1. iter ...
- vector容器+iterator迭代器
关于vector容器的详细描述,可参考:http://www.jb51.net/article/41648.htm 关于iterator迭代器的描述,可参考http://www.cppblog.c ...
- C++ Iterator迭代器介绍及Iterator迭代器用法代码举例
C++ Iterator迭代器介绍 迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针.举一个例子,你可用一个迭代器来实现对vector容器中所含元素的遍历.有这么几种迭代器如下: 迭代 ...
- 【转】Java学习之Iterator(迭代器)的一般用法 (转)
[转]Java学习之Iterator(迭代器)的一般用法 (转) 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭 ...
- 设计模式(十五):Iterator迭代器模式 -- 行为型模式
1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...
- C#:iterator 迭代器/partial class 分布类/泛型
C#:iterator 迭代器/partial class 分布类/泛型 iterator 迭代器 写个最简单的迭代,(迭代一个字符串数组): 1.实现接口中的方法: 1 using System; ...
- [设计模式] Iterator - 迭代器模式:由一份奥利奥早餐联想到的设计模式
Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...
- Python 中 Iterator(迭代器)和Iterable(迭代对象)的区别
直接可以用作for循环的数据类型有以下几种: tuple.list.dict.str等, 上述数据类型可以用作for循环的叫做可迭代对象Iterable.可以使用isinstance判断一个对象是否是 ...
- 使用Iterator迭代器循环集合
1.Iterator迭代器用于遍历集合元素,获取迭代器可以使用. 2.Iterator提供了统一遍历集合元素的 方式 ,其提供了用于遍历集合的连个方法----- boolean hasNext()判 ...
- [C# 设计模式] Iterator - 迭代器模式:我与一份奥利奥早餐的故事
Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...
随机推荐
- Opencl API解释(二)
欢迎关注,转载引用请注明 http://blog.csdn.net/leonwei/article/details/8909897 这里将更深入的说明一些OpenCL API的功能 1. 创建buff ...
- ubuntu adb devices 找不到任何东西,安装驱动
在Android平台下做开发,adb总是需要使用到的,同时,因为linux没有windows这样操作傻瓜化,有些东西还是需要自行设置的,否则将会连接不上. 关于这些内容,google也有一定的描述,可 ...
- 30分钟Git命令入门到放弃
git 现在的火爆程度非同一般,它被广泛地用在大型开源项目,团队开发,以及独立开发者,甚至学生之中. 初学者非常容易被各种命令,参数吓哭.但实际上刚上手你并不需要了解所有命令的用途.你可以从掌握一些简 ...
- ubuntu 安装软件(apt源)
最近使用docker 构建python3的环境: 进入容器发现 连个vi命令多没有... 1.安装一个呗: apt-get 报错:root@22f41d59e3b2:~# apt-get instal ...
- 基于OpenCV的人脸识别[iOS开发笔记(2)]
开始了OpenCV的试水工作了... 1.Get ready 在OpenCV中我们会使用函数cv::CascadeClassifier 来进行人脸检测.但是在使用本函数之前我们需要添加一个XML文件对 ...
- Android开发之50个常见实用技巧——添加悦目的动画效果
Hack.5 使用TextSwitcher和ImageSwitcher实现平滑过渡 实现步骤: 1.通过findViewById()方法获取TextSwitcher对象的引用Swithcer,当然也可 ...
- PHP环境配置综合篇
1.WNMP: http://www.wnmp.com.cn/ En: https://www.getwnmp.org/ 2.xampp:https://www.apachefriends.o ...
- Linux后门入侵检测工具,附bash漏洞解决方法[转载]
转自:http://blog.jobbole.com/77663/ 官网 ClamAV杀毒软件介绍 ClamAV是一个在命令行下查毒软件,因为它不将杀毒作为主要功能,默认只能查出您计算机内的病毒,但是 ...
- PowerShell常用的.Net 、COM对象(New-Object、Assembly)、加载程序集
#新建随机数对象实例:$Ran = New-Object System.Random$Ran.NextDouble() 有时候,要使用的实例的类保存在独立的库文件中,PowerShell默认未加载,会 ...
- android音乐播放器开发 SweetMusicPlayer 播放本地音乐
上一篇写了载入歌曲列表,http://blog.csdn.net/huweigoodboy/article/details/39856411,如今来总结下播放本地音乐. 一,MediaPlayer 首 ...