vector容器的end是指向最后一个元素的下一个位置,使用时要将迭代器减1,才能获取到最后一个

来源:互联网 发布:郭靖黄蓉后代 知乎 编辑:程序博客网 时间:2024/06/05 04:36

vector容器的end是指向最后一个元素的下一个位置,使用时要将迭代器减1,才能获取到最后一个

原因:

Cont是容器的类型,容器中定义了一个此容器所用的游标(迭代器)的类型,叫iterator,于是Cont::iterator it;就定义了一个名叫it的迭代器。
啥?我咋知道容器中怎么定义了iterator这个类型?嘿嘿,这就是一个Concept了。这是约定,这是规矩!STL中所有的容器都定义了一个名叫iterator的类型来表示它所用的迭代器,下文中的begin()、end()成员函数也是,所有容器都有,未来要适用于STL的容器也得有,因此你就不用担心啦。(即使实在没有,也有一些办法)
现在我们有了游标,还要让它指向正确的位置。v.begin()就是这么一个位置。它代表容器的起始位置,返回值是一个游标,指向容器的头部。于是Cont::iterator it=v.begin();这句就是定义一个迭代器并且让它指向容器的第一个元素的位置啦。
那么v.end()也就很好理解了,它返回容器的最后一个元素的位置……错!是最后一个元素后面的一个位置。
有点绕口?记得文件读取的时候有一个EOF位置么?和那个很相似,也就是越过最后一个元素(pass the end),它后方的这么一个“虚”位置。
为啥要搞这么复杂?返回最后一个元素的位置多简单直白啊?嗯,STL是有它的考虑的。

区间
这个考虑就是,为了方便表示区间这个概念。
大师们比你考虑的要全面。他们想很多算法不仅仅是作用于一个容器之上,而是作用于容器的某一部分。
比如我只想找容器中前30个元素中最小的。那么上面那个算法就没办法啦,它只能一股脑的把整个容器扫描一遍。这时候是不是就想起了中学数学中“区间”这个概念?如果我指明一个区间,指定区间起始,区间末尾,那么算法就可以针对这个区间上元素进行操作。这也就是迭代器概念引入STL的另外一个原因——有了迭代器,就可以不针对容器写算法,而是针对迭代器写算法。

 

这样的意义在于表明当begin()和end()相等时,迭代器的范围为空;当两个不等时,迭代器范围内至少有一个元素,而begin()指向该区间中的第一个元素——摘自《C++ Prima 第四版》

原创粉丝点击