简单来说,迭代器就是用来遍历容器的。
举个栗子:对于int型数组除了用下标访问,还可以通过指针访问,实际上迭代器就是对指针进行了封装。
通过代码了解一下,自己实现简单的迭代器:
#include#includeusingnamespacestd;voidshow(int*begin,int*end)//自己写的输出函数{while(begin!=end){cout<<*begin<<"";begin++;}}intmain(){intarr[]={1,2,3,4,5,68,5,2,14,5,8,4,5,8,2,5,4,5,65,9};intlen=sizeof(arr)/sizeof(arr[0]);//求出数组元素个数//指针访问int*begin=arr;int*end=arr+len;show(begin,end);//在容器中,begin,和end就是迭代器,底层封装了指针while(1);return0;}当我们把show函数编程模板函数之后,就可以输出任意类型的数组了:
template通过这个例子我们知道了,可以通过迭代器实现算法和容器的分离(show函数可以适配不同类型的数组)。所以说迭代器是一个很强的东西~大家好好学哈
STL标准库为每一种标准容器定义了一种迭代器类型,这意味着,不同容器的迭代器也不同,其功能强弱也有所不同。
常用的迭代器按功能强弱分为输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器5种
输入迭代器:也有叫法称之为“只读迭代器”,它从容器中读取元素,只能一次读入一个元素向前移动,只支持一遍算法,同一个输入迭代器不能两遍遍历一个序列。
输出迭代器:也有叫法称之为“只写迭代器”,它往容器中写入元素,只能一次写入一个元素向前移动,只支持一遍算法,同一个输出迭代器不能两遍遍历一个序列。
正向迭代器:组合输入迭代器和输出迭代器的功能,还可以多次解析一个迭代器指定的位置,可以对一个值进行多次读/写。
双向迭代器:组合正向迭代器的功能,还可以通过++操作符向后移动位置。
随机访问迭代器:组合双向迭代器的功能,还可以向前向后跳过任意个位置,可以直接访问容器中任何位置的元素。
前面我们说过迭代器实质上就是封装的指针,那么怎么封装的呢?
还是看代码吧~
#includeusingnamespacestd;classMyIterator{public:MyIterator(int*ptr):_ptr(ptr){}int*operator++()//模仿指针前置++操作{_ptr++;return_ptr;}int&operator*()//模仿对指针的取值操作{return*_ptr;}booloperator!=(MyIteratorend)//模仿指针的比较{return_ptr!=end._ptr;}private:int*_ptr;};intmain(){intarr[]={1,2,3,4,5,68,5,2,14,5,8,4,5,8,2,5,4,5,65,9};intlen=sizeof(arr)/sizeof(arr[0]);//模拟迭代器访问MyIteratorbegin=arr;MyIteratorend=arr+len;for(begin;begin!=end;++begin){cout<<*begin<<"";}while(1);return0;}把指针封装到类里面,这样就可以轻松使用了,不用担心出现乱七八糟的问题。
但是,细心的同学会发现,操作的时候是不用指针了,直接操作迭代器就行,但是赋值的时候还是指针呀~这可咋解决呢?
不要着急,请听我娓娓道来~我们可以把赋值的指针再封装一层,直接返回一个迭代器。不过这里的任务就比较庞大了,
首先,需要把数组用类封装(自己实现简单的vector);
然后,把我们刚刚写好的迭代器类稍加修改,放到类中(迭代器是一个类中类);
最后,直接把数组的首地址,和最后一个元素的下一个位置分别封装成返回迭代器的begin()和end()函数
直接上代码:
voidTest(){Vector