迭代器是神马东西

一、迭代器用来干嘛的?

本质是指针,用来遍历访问容器中元素的。

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获取迭代器型别,即如果是原生指针,定义一个特化版本。

posted @ 2013-05-23 23:07  helloweworld  阅读(200)  评论(0编辑  收藏  举报