迭代器(转载有删改)
发布日期:2021-05-08 02:10:26 浏览次数:22 分类:精选文章

本文共 1618 字,大约阅读时间需要 5 分钟。

原网址:

1.迭代器的使用

为了提高C++编程的效率,STL中提供了许多容器,包括vector、list、map、set等。
有些容器例如vector可以通过脚标[ ]索引的方式访问容器里面的数据,但是大部分的容器不能使用这种方式,例如list、map、set。(注:可以得出一个做题结论:全用迭代器尽量少出bug)
STL中每种容器在实现的时候设计了一个内嵌的iterator类,不同的容器有自己专属的迭代器,使用迭代器来访问容器中的数据。
除此之外,通过迭代器,可以将容器和通用算法结合在一起,只要给予算法不同的迭代器,就可以对不同容器执行相同的操作,例如find查找函数。
迭代器对指针的一些基本操作如*、->、++、==、!=、=进行了重载,使其具有了遍历复杂数据结构的能力,其遍历机制取决于所遍历的数据结构,所有迭代的使用和指针的使用非常相似。通过begin,end函数获取容器的头部和尾部迭代器,end 迭代器不包含在容器之内,当begin和end返回的迭代器相同时表示容器为空。

2.迭代器的种类

根据迭代器所支持的操作,可以把迭代器分为5类。

  1. 输入迭代器:是只读迭代器,在每个被遍历的位置上只能读取一次。例如上面find函数参数就是输入迭代器。

  2. 输出迭代器:是只写迭代器,在每个被遍历的位置上只能被写一次。

  3. 前向迭代器:兼具输入和输出迭代器的能力,但是它可以对同一个位置重复进行读和写。但它不支持operator–,所以只能向前移动。

  4. 双向迭代器:很像前向迭代器,只是它向后移动和向前移动同样容易。

  5. 随机访问迭代器:有双向迭代器的所有功能。而且,它还提供了“迭代器算术”,即在一步内可以向前或向后跳跃任意位置, 包含指针的所有操作,可进行随机访问,随意移动指定的步数。支持前面四种Iterator的所有操作,并另外支持it + n、it - n、it += n、 it -= n、it1 - it2和it[n]等操作。

STL每种容器类型都定义了 const_iterator只能读取容器的值,不能修改所指向容器范围内元素的值。记住:vector、string、deque随机存取迭代器list、set、map、mutiset、multimap双向迭代器。

3.迭代器失效

容器的插入insert和erase操作可能导致迭代器失效,对于erase操作不要使用操作之前的迭代器,因为erase的那个迭代器一定失效了,正确的做法是返回删除操作时候的那个迭代器
在这里插入图片描述

#include 
using namespace std;int main(int argc, const char *argv[]) { int arr[5] = { 1, 2, 3, 4, 5 }; vector
iVec(arr, arr + 5); //定义容器vector //迭代器失效// for (vector
::iterator it = iVec.begin(); it != iVec.end();) {// iVec.erase(it);// } //返回erase操作之后的迭代器 for (vector
::iterator it = iVec.begin();it != iVec.end();) { it = iVec.erase(it); } return 0;}

各容器支持迭代器的类别

每种容器类型都定义了自己的迭代器类型,如vector:vector< int>:: iterator iter; //定义一个名为iter的变量,数据类型是由vector< int>定义的iterator 类型。常用迭代器类型如下:

在这里插入图片描述

上一篇:UVA 10340 子序列 All in All 题解(string数组解法)
下一篇:计算机工作原理(摘自百度百科,有删改)

发表评论

最新留言

不错!
[***.144.177.141]2025年04月20日 07时02分40秒