您的位置:首页 > 其它

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

2012-07-12 18:50 615 查看
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 第四版》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐