部分摘自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迭代器的使用的更多相关文章

  1. ES6笔记(6)-- Set、Map结构和Iterator迭代器

    系列文章 -- ES6笔记系列 搞ES6的人也是够无聊,把JS弄得越来越像Java.C++,连Iterator迭代器.Set集合.Map结构都出来了,不知道说什么好... 一.简单使用 1. iter ...

  2. vector容器+iterator迭代器

    关于vector容器的详细描述,可参考:http://www.jb51.net/article/41648.htm   关于iterator迭代器的描述,可参考http://www.cppblog.c ...

  3. C++ Iterator迭代器介绍及Iterator迭代器用法代码举例

    C++ Iterator迭代器介绍 迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针.举一个例子,你可用一个迭代器来实现对vector容器中所含元素的遍历.有这么几种迭代器如下: 迭代 ...

  4. 【转】Java学习之Iterator(迭代器)的一般用法 (转)

    [转]Java学习之Iterator(迭代器)的一般用法 (转) 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭 ...

  5. 设计模式(十五):Iterator迭代器模式 -- 行为型模式

    1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用 ...

  6. C#:iterator 迭代器/partial class 分布类/泛型

    C#:iterator 迭代器/partial class 分布类/泛型 iterator 迭代器 写个最简单的迭代,(迭代一个字符串数组): 1.实现接口中的方法: 1 using System; ...

  7. [设计模式] Iterator - 迭代器模式:由一份奥利奥早餐联想到的设计模式

    Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...

  8. Python 中 Iterator(迭代器)和Iterable(迭代对象)的区别

    直接可以用作for循环的数据类型有以下几种: tuple.list.dict.str等, 上述数据类型可以用作for循环的叫做可迭代对象Iterable.可以使用isinstance判断一个对象是否是 ...

  9. 使用Iterator迭代器循环集合

    1.Iterator迭代器用于遍历集合元素,获取迭代器可以使用. 2.Iterator提供了统一遍历集合元素的 方式 ,其提供了用于遍历集合的连个方法----- boolean  hasNext()判 ...

  10. [C# 设计模式] Iterator - 迭代器模式:我与一份奥利奥早餐的故事

    Iterator - 迭代器模式 目录 前言 回顾 UML 类图 代码分析 抽象的 UML 类图 思考 前言 这是一包奥利奥(数组),里面藏了很多块奥利奥饼干(数组中的元素),我将它们放在一个碟子上慢 ...

随机推荐

  1. Java---XML的解析(2)-DOM4J解析/Xpath

    Dom4j: Dom SUN dom在加载时,将所有元素全部加载内存 DOM4j - 第三方. Dom4j是一个开源.灵活的XML API. 目前很多开源框架如struts,hibernate都使用d ...

  2. HTML5与CSS3权威指南.pdf1

    第2章 HTML5与HTML4的区别 HTML5的文件扩展符与内容类型保持不变仍为“.html”或“.htm”,内容类型(ContentType)仍为“text/html” DOCTYPE声明: HT ...

  3. codeforces 358D

    题目链接:http://codeforces.com/contest/358/problem/D #include<cstdio> #include<iostream> #in ...

  4. nyoj 1036 非洲小孩【贪心区间选点】

    非洲小孩 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 家住非洲的小孩,都很黑.为什么呢?第一,他们地处热带,太阳辐射严重.第二,他们不经常洗澡.(常年缺水,怎么洗 ...

  5. 部署war包到tomcat服务器

    1.首先通过eclipse的maven install生成项目的war包 2.然后把war包解压到tomcat目录下的webapps目录下 3.然后运行tomcat下的bin目录下的startup.b ...

  6. The server does not support version 3.1 of the JEE Web module specification.

    使用MyEclipse2015打开MyEclipse2014编辑的项目,在服务器Tomcat 7部署时,提示"The server does not support version 3.1 ...

  7. MFC发送自定义消息-PostMessage和SendMessage

    PostMessage:把消息投放到线程的消息队列,不能消息被处理就立即返回SendMessage:消息被处理完后才返回 几种发送消息的写法:   ::PostMessage(GetSafeHwnd( ...

  8. JOptionPanel类的解析

    JOptionPane类提示框的一些常用的方法 XMLOracleSwing  最近在做swing程序中遇到使用消息提示框的,JOptionPane类其中封装了很多的方法. 很方便的,于是就简单的整理 ...

  9. 在code.org上自己写一个flappy bird游戏

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在code.org上自己写一个flappy bird游戏.

  10. mysql出现Got error 28 from storage engine错误

    今天晚上碰到app数据库出错Got error 28 from storage engine 服务程序出现这样的错误 Sql.Data---Error writing file '/tmp/ML2ig ...