Daily C/C++ 迭代器
迭代器相信平常用stl稍微多一点的同学肯定都很熟悉了,这篇文章就是介绍一下基本的迭代器的概念,帮助理解还不是那么清晰的同学理解一下迭代器的概念
如果是从C转过来学习C++的同学可能会发现,迭代器就很像是指针一样。是的,迭代器就是在容器中对指针抽象的结果,所以迭代器可以看作是C++的指针,但是对于内存不连续的容器来说,迭代器其实是拓宽了原本指针的功能
那么首先明确,迭代器实际上是一个规范,即如果一个类型满足了如下几个条件,就可以被看作是一个迭代器
1.对象可以被拷贝构造,拷贝赋值和析构
2.对象支持*运算符,即得到迭代器对应的数据
3.对象支持前置的++运算符
我们平常使用的迭代器有着更加深入的规定,具体的
如果迭代器是作为右值,可读的,同时满足了后置的++运算符,那么这就是一个输入迭代器
但是输入迭代器只能单次访问对象,即读入一次就会移动到下一个。如果要求可以允许多次访问的话,那么就是一个前向迭代器
如果不仅支持++,同时支持了--,即既可以正向遍历,也可以反向遍历,那么就是一个双向迭代器
如果迭代器支持+,-,+=等运算符可以跳跃的移动迭代器,那么这就是一个随机访问迭代器
如果随机访问迭代器满足对象在内存中是连续存放的,那么这就是连续迭代器
上面说的都是作为右值,如果一个迭代器只能作为左值,那么这就是一个输出迭代器
我们可以想一下平常使用的迭代器,比如vector中的迭代器就是连续迭代器
对于迭代器来说,还有一个关系密切的概念,是基于range的for循环
就是我们平常用的for(type x : container)
那么他的底层到底是在做什么呢?
他会根据冒号后边范围表达式的结果,产生一个引用,同时自动便利这个范围的迭代器
循环内会自动生成根据左边的声明和*it来进行初始化的语句
对于C的数组,他会自动生成指向数组头尾的指针
对于有begin和end成员的对象,会调用对应的begin和end成员函数
否则他会在命名空间内查找可以用于该类型的begin和end函数
对于自己定义的迭代器,C++要求我们定义以下类型
如果大家需要具体的实现迭代器,还是去cppreference参考,这里就不再多加赘述
这篇文章讲的很迷,大家可以再去看一下参考文章获得更多理解
文章评论