分类: c/c
2013-08-08 14:19:51
阅读此文 需要一点c ,数据结构与算法基础(仅仅是基础就够了)
stl中有很重要的两个部分,容器和算法。所谓容器,就是装有很多数据的黑箱子,所谓算法,就是对这些数据进行计算。这其中有一个很重要的问题,对于算法来说容器是一个黑箱子,它不知道容器的内部结构,但是它又要知道容器中有什么数据,这就需要一个桥梁来连接容器与算法。这个桥梁可以对所有容器中的数据进行访问,所有算法的实现又要依赖于这个桥梁,所以这个东西显得尤为重要。在stl中,这个桥梁被称为迭代器。讲容器时要用到迭代器的使用,讲算法也要用到迭代器的使用,看起来先讲迭代器好像有点突兀,其实也未必不可。
要对容器进行访问需要解决如下几个问题:
1.如何指明我们想要查找的序列
2.如何表示序列中的位置
3.如何移动到下一个元素
4.如何知道我们已经到达序列尾端了
5.用来表示查找失败的返回值是什么
如果数据是连续存储的,那么遍历起来就很方便了,直接用指针就可以了,以上问题都可以解决:
1.用首尾指针或是指向首元素的指针加元素个数就可以
2.直接用指针
3. 操作即可
4.到达尾部指针或是数量够了
5.空指针null即可
用模板就很容易实现这些东西了,但是在容器中数据并不一定是连续存储的,那么该怎么办呢,stl给出了一种很好的解决办法,用迭代器来模拟指针,为了使用的方便,它的很多操作都和指针相似,再来看一下刚才的五个问题:
1.是使用两个迭代器来标识一个序列,还是用首元素的迭代器加元素个数呢,stl选择了前者,原因有很多,主要就是因为它比较方便,如果你使用迭代器或是实现一个迭代器,就能体会到
2.直接用迭代器就可以了,用于标识一个元素的迭代器其实内部还是用指针实现的
3.重载 (前置,后置)运算符即可
4.使用一个特殊的迭代器,它指向最后一个元素之后,此迭代器不可dereference
5.stl中还是使用了上边那个特殊的迭代器,这个可能是为了实现起来比较方便
还有一个问题就是为何采用了[begin,end)这样一个不对称的区间,其实这个风格是完全符合c 的语法的,其数组就是从0开始计数的,end与begin之差也表示容器中元素的个数,用多了也会感觉这样会很舒服的。
其实迭代器并不是上边说的这么简单,它里面还有很多东西,以后会慢慢讲。迭代器初步的介绍就到这里,以后的内容可能会比较枯燥,如果没有兴趣,看到这里也就可以了,完。