一、迭代器用来干嘛的?
本质是指针,用来遍历访问容器中元素的。
STL实现了容器和算法的分离,如何实现的呢,答曰用类模板和函数模板,也可理解为所谓的泛化。那么容器和算法又是怎样结合在一起的呢,答曰迭代器——使用算法时,传给算法的是迭代器!
二、迭代器常用运算。
所有标准库容器的迭代器都提供*iter iter->mem ++iter --iter iter1 == iter2 iter1 != iter2等。
但是只有vector和deque支持 iter + n iter – n iter1 += iter2 iter1 – iter2 和 关系运算符。
从容器的存储方式上很好理解原因(连续 、 节点式/链式)。
三、迭代器的种类。
输入迭代器 输出迭代器 前向迭代器(slist) 双向迭代器(list) 随机访问迭代器(vector 、deque) 。
从迭代器支持的运算,或者从容器的存储结构上理解。如slist单向链表——只允许访问下一个元素;vector连续存储,可以访问任意一个(++ 、-- 、 iter + n等)。
四、为什么需要迭代器型别,如何实现迭代器型别的?
通过上面分析,我们知道迭代器将容器和算法结合在一起,给算法一个迭代器,可以完成相应操作,如果算法需要知道迭代器所指对象的类型呢?
我们想到用function template实现,但是如果返回值就要知道所指对象的型别,function template就不行了。
然后想到用内嵌型别,即将迭代器定义为class type,将所指对象类型value_type作为迭代器类的成员。但是原生指针不是class type,而算法必须能够接受原生指针,怎么办?
最终STL采用偏特化traits获取迭代器型别,即如果是原生指针,定义一个特化版本。