STL之iterator
来源:互联网 发布:ipad漫画软件 编辑:程序博客网 时间:2024/06/07 00:00
iterator只有4个小节,比起其它的章节来说算是比较少了。总结起来也不是很多。
第一节中我认识到,原来迭代器不只有iterator,还有const_iterator,reverse_iterator和const_reverse_iterator。但是作者建议我们多用iterator,因为STL中的算法函数的参数大部分是基于iterator的。而在这另外三种迭代器中,只有reverse_iterator能够转化为iterator。所以如果你用了这几个迭代器,那在使用算法方法的时候就要涉及到类型的转化,而这种操作将严重的影响程序的执行效率。
那么如果我要不巧碰只有const_iterator可用,要想调用算法方法该怎么办呢?如果想当然的认为可以通过拷贝构造函数或者const_cast来进行类型转换那是行不通的,因为除了vector和string类型的Iterator是内建的指针类型,可以cast来互相转换外,其余的容器的iterator和const_iterator其实是两个不同的class,而且他们又没继承关系,在这两个class之间转换是没有意义的事情。怎么办呢?这里作者给了一个巧妙的办法。可以联合使用distance和advance来达到同样的目的。首先使用distance计算两个迭代器之间的距离,然后用advance将iterator加上这个距离就得到了与const_iterator所指位置相同的iterator。由于distance要计算的两个迭代器必须是同种类型,所以在使用distance前要想iterator转化成const_iterator(这是可以的,但是反过来不行)。
reverse_iterator同样不能直接用于算法方法,但是正如前面提到的,reverse_iterator可以通过base()成员函数转化成iterator。转化后的的iterator指向的位置是reverse_iterator的右边的元素。假设ri是reverse_iterator(指向3),i是ri.base()所返回的iterator那么他们位置就行该是如下的样子。这时要在4的位置插入一个数(比如说99),那么4的位置被99占据,同时4(包括4)之后的元素应该
←后 ri+1↓ ri↓
1 2 3 4 5
i↑ 后→
向后移动一味。但这里要注意的是在reverse_iterator中一切都是同iterator的方向相反的。即右边为前,左边为后。那么99在感觉上是插入了ri的右边(reverse_iterator中的“前边”),和i的左边(iterator认为的“前边”)。如果你你想用ri来实现在3的左边插入数据的话,就必须要用(++ri).base()来调用insert。同理,如果你要想删除3的话,也要用(++ri).base(),否则就把4给删除了。这里其实主要是一个方向的问题,搞清了方向就很好理解了。
最后的这一节作者交给我们了一个提高输入输出速度的方法,用istreambuf_iterator来代替ifstream,具体的例子就是下面的代码。在fileData时,用istreambuf_iterator<>来代替istream_iterator<>。
ifstream inputFile("interestingData.txt");
string fileData((istreambuf_iterator<char>(inputFile)),
istreambuf_iterator<char>());
- STL之iterator
- STL之iterator
- STL之iterator(迭代器)
- stl之迭代器(iterator)
- STL之Iterator
- C++ stl之迭代器(iterator)
- STL 之 iterator traits 备忘
- STL之Input & Output Iterator
- STL源码剖析之Iterator
- STL之三 iterator、iterator tag、iterator traits
- 设计模式之iterator模式到STL中iterator迭代器
- SGI STL 源码解读之 Iterator
- ACM/ICPC竞赛之STL--iterator简介
- stl之vector的iterator坑
- STL学习笔记之迭代器--iterator
- ACM/ICPC竞赛之STL--iterator简介
- c++ STL标准容器之Iterator使用
- STL源码剖析之迭代器Iterator
- 数据库高手请进 !! 解决 效率 及 繁琐 字段 问题
- Castor功能与应用参考(转)
- ibatis介绍(转)
- 《原创》 IP自动修改器
- 同步和互斥的一些解答
- STL之iterator
- 关于工作的感悟
- SQL常用分页的办法(zt)
- 敢问路在何方?我该怎么办?
- 给自己的软件添加后门
- 2010最危险的编程错误
- 我的面试感悟
- 在Corex-M3开发板上移植.Net Micro Framework系列文章
- C语言写的简易计算器