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 第四版》
- vector容器的end是指向最后一个元素的下一个位置,使用时要将迭代器减1,才能获取到最后一个
- vector.end()指向的是最后一个元素的下一个位置,所以访问最后一个元素的正确操作为:vector.end() - 1;
- 容器篇:取vector最后一个元素的方法
- 容器篇:取vector最后一个元素的方法
- 如何利用迭代器获取vector的最后一个元素
- 为什么指向的是最后一个节点的下一个节点 http://www.zhihu.com/question/20638791
- JavaScript 获取数组的最后一个元素
- 使用mongodb的aggregate实现获取数组最后一个元素
- 容器的最后一个元素是否大于第一个元素
- php 获取数组第一个元素 以及最后一个元素 && 最后一个元素的键名
- C++ STL 顺序容器访问最后一个元素的方法
- 获取字符串中最后出现的一个字符的位置
- sqlserver中获取最后一个字符所在的位置
- 判断是否是最后一个数组元素的方法
- 获取数组最后一个元素的key值
- 将数据中的元素都向前移动一个位置,最后一个元素的值是原来第一个元素的值,然后输出这个数组。
- vector::erase方法,返回值是更新后的容器的被删除元素的后一个元素的迭代器,如果需要指向删除元素的前面一个元素的迭代器就要-1
- awk命令的使用(三)获取数组的最后一个元素
- php优化
- 让editText不自动获得焦点
- 我不知道的java_volatile
- MFC在其他类中访问主窗体的成员
- [Android]手动触发OnClick事件
- vector容器的end是指向最后一个元素的下一个位置,使用时要将迭代器减1,才能获取到最后一个
- 黑马程序员——java编程基础
- dos 启动sqlserver
- delphi程序模块详解
- 实习总结(三)---Java语言特点
- TC下显示256色bmp图像
- ContactsContract.Contacts中的所有字段
- android 检查可用网络
- WPF中将Dictionary<T,T>类型做为数据源绑定到TreeView上