1. 迭代器介绍
本章并不研究不同类型的迭代器,只总结常见迭代器的使用和误区。
定义
:迭代器(iterator)有时又称光标(cursor),是程序设计的软件设计模式,可在容器对象(container,例如链表或数组)上遍历的接口,设计人员无需关心容器对象的内存分配的实现细节。
背景
:指针可以用来遍历存储空间连续的数据结构,但是对于非连续存储的数据结构,就需要一个行为类似于指针的类,来对非连续数据结构进行遍历。正如定义里标红所说,迭代器可以遍历非连续的数据结构。
在C++中,我们更倾向于使用迭代器而不是使用下标操作,因为标准库为每一种标准容器(如vector)定义了一种迭代器类型,而只有少数容器(如vector)支持下标操作访问容器元素。
2. 初始化
每种容器都定义了自己的迭代器类型,可以使用auto自动声明迭代器的类型,也可以显示的将迭代器类型写出来:
//只有顺序容器(不包括array)的构造函数才接受大小参数
vector<int> vec(num, val);
vector<int>::iterator it = vec.begin();
//auto it = vec.begin();
3. 常用操作
下面表格列出了迭代器的常用操作:
*iter | 解引用,返回迭代器指向的元素的引用 |
---|---|
iter->member | 等效于(*iter).member |
++iter, iter++ | iter + 1,指向容器的下一个元素 |
–iter, iter– | 同上 |
iter1 == iter2 | 比较两个迭代器是否相等 |
iter1 != iter2 |
在C++定义的容器类型中,只有vector,string和queue容器提供迭代器算术运算和除!=和==之外的关系运算:
iter + n, iter - n | 迭代器+或-一个常数,必须指向容器内或尾后元素(end()) |
---|---|
iter1 += iter2 | 同上 |
iter1 -= iter2 | 同上 |
iter1 - iter2 | 获得两个迭代器之间的距离 |
>, >=, <, <= | 元素靠后的迭代器大于靠前的迭代器 |
注意:
迭代器并不是所有都可以进行加减常数。 能进行算数运算的迭代器只有随机访问迭代器。要求容器元素存储在连续空间内;即vector、string、deque的迭代器是有加减法的;但是list、forward_list、map、set的迭代器是没有加减法的,它们仅支持++iter、–iter这些操作。 it++和++it的区别
在STL中的容器使用迭代器进行遍历时,it++与++it的效果是相同的,遍历的次数也是相同的,但是在STL中效率却不同:
++it返回的是引用;it++返回的是临时对象;–it同理。
原因:it++每次都要返回一个无用的临时对象,所以每一次遍历,你都进行了一次创建并销毁对象的操作。(leetcode小本本记好了!)
总结
到此这篇关于c++下迭代器总结的文章就介绍到这了,更多相关c++ 迭代器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!