初探迭代器

来源:互联网 发布:程序员网上兼职平台 编辑:程序博客网 时间:2024/05/17 21:46

       阅读此文 需要一点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之差也表示容器中元素的个数,用多了也会感觉这样会很舒服的。

       其实迭代器并不是上边说的这么简单,它里面还有很多东西,以后会慢慢讲。迭代器初步的介绍就到这里,以后的内容可能会比较枯燥,如果没有兴趣,看到这里也就可以了,完。

原创粉丝点击