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>());

原创粉丝点击