C++基础之迭代器iterator

我们已经知道可以使用下标运算符来访问string对象的字符或vector对象的元素,还有另一种更通用的机制也可以实现同样的目的,这就是迭代器(iterator)

标准库容器都可以使用迭代器,但是只有少数几种才同时支持下标运算符。

类似于指针类型,迭代器也提供了对对象的间接访问。就迭代器而言,其对象是容器中的元素或者string对象中的字符。使用迭代器可以访问某一个元素,迭代器也能从一个元素移动到另外一个元素。迭代器和指针一样,有无效和有效的区别。

有效的迭代器指向元素或者尾元素的下一个位置,其他情况都属于无效的迭代器。

使用迭代器

能够使用迭代器的变量类型拥有返回迭代器的方法。

begin()方法负责返回指向第一个元素的迭代器

end()方法负责返回指向容器尾元素的下一个位置的迭代器

  1. // b表示v的第一个元素,e表示v尾元素的下一个位置
  2. auto b = v.begin(), e = v.end(); // b和e的类型相同

特殊情况下:

如果容器为空,则beginend返回的是同一个迭代器。

迭代器运算符

运算符 含义
*iter 返回迭代器iter所指元素的引用
iter->mem 解引用iter并获取该元素的名为mem的成员,等价于*(iter).mem
++iter 令iter指向容器中的下一个元素
--iter 令iter指向元素中的上一个元素
iter1 == iter2 判断两个迭代器是否相等

这使得迭代器就想下标一样的好用,比如:

  1. string s("come thing");
  2. if (s.begin() != s.end()) {
  3. auto it = s.begin();
  4. *it = toupper(*it);
  5. }

迭代器类型

就想不知道stringvectorsite_type成员到底是什么类型一样,一般来说我们也不知道迭代器的精确类型。而实际上,那些拥有迭代器的标准库类型都会使用iteratorconst_iterator来表示迭代器的类型:

  1. vector<int>::iterator it; // it能代表vector<int>的元素
  2. string::iterator it2; // it2能代表string对象中的元素
  3. vector<int>::const_iterator it3; // it3只能代表读元素,不能代表写元素
  4. string::const_iterator it4; // it4只能读字符,不能写字符,即改变字符的值

const_iterator和常量指针差不多,能读取但不能修改他所指元素的值。

如果vector对象或string对象是一个常量,只能使用const_iterator

结合解引用和成员访问操作

解引用可以获得迭代器所指的对象,如果该对象的类型恰好是个类,就有可能进一步访问他的成员。例如:

  1. vector<string> strs = {"string", "", "tingyugetc"};
  2. for (auto it = strs.begin(); it != strs.end() ; ++it) {
  3. if (it->empty()) {
  4. cout << "now is in empty string" << endl;
  5. }
  6. }

上述的代码中使用了箭头运算符, 箭头运算符将解引用和成员访问两个操作结合在一起,他的作用和(*it).empty()相同。

(*it).empty()的圆括号必不可少,其含义是先执行括号内的解引用,接着解引用的结果在执行点运算符。如果不加括号,那么点运算符将由it执行,而不是it解引用的结果。

迭代器失效

某些对vector对象的操作会使迭代器失效.

谨记,但凡使用了迭代器的循环体,都不要想迭代器所属的容器添加元素

迭代器的运算

迭代器的递增运算令迭代器每次移动一个元素,所有的标准库都有支持递增运算符的迭代器。类似的,也能用==!=对任意标准库类型的两个有效迭代器进行比较。

同样的,可以令迭代器和一个整数值相加或相减,其返回值是向前或向后移动了若干个位置的迭代器,执行这样的操作时,结果迭代器要么指向原vector对象内的一个元素要么指向尾元素的下一个位置。

比如,可以这样:

  1. // 计算得到最接近vi中间元素的一个迭代器
  2. auto mid = vi.begin() + vi.size() / 2;

使用迭代器运算的一个经典算法是二分搜索。

  1. auto beg = text.begin(), end = text.end();
  2. auto mid = beg + (end - beg) / 2;
  3. while (mid != end && *mid != found) {
  4. if (found < *mid) {
  5. end = mid;
  6. } else {
  7. beg = mid + 1;
  8. }
  9. mid = beg + (end - beg) / 2;
  10. }

C++基础之迭代器iterator的更多相关文章

  1. java基础知识5--集合类(Set,List,Map)和迭代器Iterator的使用

    写的非常棒的一篇总结: http://blog.csdn.net/speedme/article/details/22398395#t1 下面主要看各个集合如何使用迭代器Iterator获取元素: 1 ...

  2. [oldboy-django][5python基础][高级特性]Iterator迭代器

    # 区分可迭代对象iterable, 迭代器iterator, 生成器generator a. iterable 可直接用for循环的对象,都称为可迭代对象, from collections imp ...

  3. C++迭代器 iterator【转】

    1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型.(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter ...

  4. C++迭代器 iterator

    1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型.(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter ...

  5. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  6. VC++ 迭代器 iterator, const_iterator, const iterator

    迭代器 iterator, const_iterator, const iterator 迭代器iterator的作用类似于指针. (1)iterator只有针对制定<类型>的容器才有效. ...

  7. 迭代器iterator

    现在接着上篇的,写一来标识vector 的元素的对象迭代器iterator: 还是通过具体代码举例: 下面我讲了一个我暑期团队的故事哦~~: #include<iostream> #inc ...

  8. c++中的迭代器 iterator

    迭代器iterator的作用类似于指针. iterator只有针对制定<类型>的容器才有效.例如: vector<int> vec; vector<int>::it ...

  9. Python的迭代器(iterator)和生成器(constructor)

    一.迭代器(iterator) 1.迭代器的概述 在Python中,for循环可以用于Python中的任何类型,包括列表.元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器 迭代器 ...

随机推荐

  1. C#中ESRI.ArcGIS.esriSystem的引用问题

    ESRI.ArcGIS.esriSystem,在引用里没有它的同名引用,其实它对应的引用为ESRI.ArcGIS.System,所以添加“ESRI.ArcGIS.System”这个引用即可

  2. js -- 时间转年月日

    /** * 时间转年月日 * @param sdate 开始的时间 * @param edate 结束的时间 * @returns {*} */ function day2ymrStr2(sdate, ...

  3. LVS-DR模式搭建

    出于对架构的兴趣,一有时间我就会了解一下如何搭建一个高并发,高可用,可扩展的服务器运行环境.LVS-DR究竟现在的企业运用频率有多高其实我也不清楚,本文是下班之余断断续续研究搭建笔录,并且仅仅在vir ...

  4. Linux下run文件的直接运行

    比如realplay.run 安装方法如下 chmod +x realplay.run ./realplay.run 然后他就会执行安装了,在过程中可能会要求你输入yes或no 安装完后就可以用了 , ...

  5. Java-POJ1005-I Think I Need a Houseboat

    盗用的翻译,哈哈哈!白嫖就完事了. 题目: 密西西比河岸某处陆地因为河水侵蚀,每年陆地面积都在减少,每年减少50平方英里,减少的陆地面积呈半圆形,即该半圆形面积以每年50平方英里的速度增长.在第一年初 ...

  6. 通过JMX获取JVM信息

    package com.googosoft.gateway_zuul; import java.lang.management.ClassLoadingMXBean; import java.lang ...

  7. AC3 exponent coding

    1.overview AC-3编码的audio信号中的频率系数由浮点型数据表示,并将其归一化到0~1之间. transform coefficient由exponent和mantissa组成. 设tr ...

  8. 一文复习JSP内容

    概念: JSP 全名为 Java Server Pages, 中文名叫 java 服务器页面, 其根 本是一个简化的 Servlet 设计, 它是由 Sun Microsystems 公司 倡导. 许 ...

  9. 动态设置微信小程序 navigationBarTitle 的值

    wx.setNavigationBarTitle({ title:' 动态值 ' })

  10. codeforces 962F.simple cycle(tarjan/点双连通分量)

    题目连接:http://codeforces.com/contest/962/problem/F 题目大意是定义一个simple cycle为从一个节点开始绕环走一遍能经过simple cycle内任 ...