[转]了解如何通过reverse_iterator的base得到iterator
转自:http://blog.csdn.net/shuchao/article/details/3705252
调用reverse_iterator的base成员函数可以产生“对应的”iterator,但这句话有些辞不达意。举个例子,看一下这段代码,我们首先把从数字1-5放进一个vector中,然后产生一个指向3的reverse_iterator,并且通过 reverse_iterator的base初始化一个iterator:

vector<int> v;
v.reserve(); // 参见条款14
for(int i = ;i <= ; ++ i) { // 向vector插入1到5
v.push_back(i);
}
vector<int>::reverse_iterator ri = // 使ri指向3
find(v.rbegin(), v.rend(), );
vector<int>::iterator i(ri.base()); // 使i和ri的base一样

执行上述代码后,可以想到产生的结果就像这样:
这张图很好,显示了reverse_iterator和它对应的base iterator之间特有的偏移量,就像rbegin()和rend()与相关的begin()和end()一样,但并没有说出了所有你需要知道的东西。特别是,它并没有解释怎样在ri上实现你在i上想要完成的操作。有些容器的成员函数只接受iterator类型的参数,所以如果你想要在ri所指的位置插入一个新元素,你不能直接这么做,因为vector的insert函数不接受reverse_iterator。如果你想要删除ri 所指位置上的元素也会有同样的问题。erase成员函数会拒绝reverse_iterator,坚持要求iterator。为了完成删除和一些形式的插入操作,你必须先通过base函数将reverse_iterator转换成iterator,然后用iterator来完成工作。
先让我们假设你要在ri指出的位置上把一个新元素插入v。特别的,我们假设你要插入的值是99。记住ri在上图中遍历的顺序是自右向左,而且插入操作会将新元素插入到ri位置,并且将原先ri位置的元素移到遍历过程的“下一个”位置,我们认为3应该出现在99的左侧。插入操作之后,v看起来像这样:
当然,我们不能用ri来指定插入的地方,因为它不是一个iterator。我们必须用i来代替。如上所述,当ri指向3时,i(就是i.base())指向4。如果我们用ri来指定插入位置,那么用i指向插入位置,那个假设就是正确的。结论呢?● 要实现在一个reverse_iterator ri指出的位置上插入新元素,在ri.base()指向的位置插入就行了。对于insert操作而言,ri和ri.base()是等价的,而且ri.base()真的是ri对应的iterator。现在再来考虑删除元素的情况。回顾一下最初的vector(也就是在插入99之前)ri与i的关系:
如果你要删除ri指向的元素,你不能直接使用i了,因为i与ri不是指向同一个元素。因此,你要删除的是i的前一个元素。 ● 要实现在一个reverse_iterator ri指出的位置上删除元素,就应该删除ri.base()的前一个元素。对于删除操作而言,ri和ri.base()并不等价,而且ri.base()不是ri对应的iterator。
我们还是有必要看看删除操作的代码,因为它还挺令人惊讶的。
vector<int> v;
... // 向v插入1到5,同上
vecot<int>::reverse_iterator ri =
find(v.rbegin(), v.rend(), ); // 同上,ri指向3
v.
[转]了解如何通过reverse_iterator的base得到iterator的更多相关文章
- 浅谈reverse_iterator的base()函数
非原创,原文链接:http://blog.csdn.net/shuchao/article/details/3705252 调用reverse_iterator的base成员函数可以产生"对 ...
- 条目二十八《正确理解由reverse_iterator的base()成员函数所产生的iterator的用法》
条目二十八<正确理解由reverse_iterator的base()成员函数所产生的iterator的用法> 迭代器的种类一共有四种,上面已经说过了.这里就不再次写出来. 这一个条目主要是 ...
- Effective STL 中文版(大全)
Effective STL 中文版(大全) 作者:winter 候捷说,对于STL,程序员有三个境界,开始是使用STL,然后是理解STL,最后是补充STL.Effective STL是一本非常好的书, ...
- ###《Effective STL》--Chapter4
点击查看Evernote原文. #@author: gr #@date: 2014-09-14 #@email: forgerui@gmail.com Chapter4 迭代器 Topic 26: i ...
- std::reverse_iterator::base
google chromium base MRU_Cache 支持反向erase iterator Erase(iterator pos) { deletor_(pos->second); ...
- 迭代器类vector::iterator 和 vector::reverse_iterator 的实现、迭代器类型、常用的容器成员
一.迭代器 迭代器是泛型指针 普通指针可以指向内存中的一个地址 迭代器可以指向容器中的一个位置 STL的每一个容器类模版中,都定义了一组对应的迭代器类.使用迭代器,算法函数可以访问容器中指定位置的元素 ...
- 条目二十六《iterator优先于const_iterator、reverse_iterator以及const_reverse_iterator》
条目二十六<iterator优先于const_iterator.reverse_iterator以及const_reverse_iterator> 这几个东西不是类型来的,而是不同的类,所 ...
- C++ Primer :第十章 :泛型算法之再探迭代器以及其他算法
除了为每个容器定义的迭代器之外,标准库在头文件<iterator>还定义了额外集中迭代器, 包括: 插入迭代器,这些迭代器被绑定到一个容器上,可以向容器插入元素. 流迭代器, 这些迭 ...
- C++ 容器一些细节
今天学习是看到了讲解C++容器的一些细节用法,故记之!参考:http://www.cnblogs.com/answeryi/archive/2011/12/16/2289811.html: 目录 == ...
随机推荐
- 如何构建高性能MySQL索引
本文的重点在于如何构建一个高性能的MySQL索引,从中你可以学到如何分析一个索引是不是好索引,以及如何构建一个好的索引. 索引误区 多列索引 一个索引的常见误区是为每一列创建一个索引,如下面创建的索引 ...
- 最新Java面试题及答案整理
基础篇 一.基本功 面向对象特征 封装,继承,多态和抽象 1. 封装 封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内部的数据.在 Java 当中,有 3 种修饰 ...
- Missing iOS Distribution signing identity
打包上传appstore的时候报错如下: 解决方法: Download https://developer.apple.com/certificationauthority/AppleWWDRCA.c ...
- html+jquery制作网页地图
http://jvectormap.com/ <!--StartFragment --> JVectorMap 是一个显示矢量地图的jQuery插件.它使用 SVG 在Firefox 3 ...
- 浅谈iPhone OS(iOS)架构
iPhone OS(现在叫iOS)是iPhone, iPod touch 和 iPad 设备的操作系统
- Android实现图片缩放示例
package com.example.demo; import android.os.Bundle; import android.app.Activity; import android.grap ...
- js防止表单重复提交
1.表单 <form id="addForm" onsubmit="getElementById('submitInput').disabled=true;retu ...
- NFS 简介
一.NFS 简介 1. NFS(Network File System)网络文件系统,它允许网络中的计算机之间通过 TCP/IP 网络共享资源2. NFS 应用场景:A,B,C 三台机器上需要保证被访 ...
- VS调试DLL代码使用”附加到进程“
如果一个DLL解决方案,被另一个DLL2解决方案依赖,DLL2被可执行程序exe1引用 如何调试DLL的代码断点呢 1.可以参考另一篇随笔DLL如何调试 2.先运行起来exe1,然后再DLL项目中”调 ...
- ASP.NET MVC入门到精通——数据库仓储
业务层调用数据层对象,我不想每次都new一个数据层对象,而是在数据层创建一个仓储,统一管理所有的对象调用. 1.在IDAL项目中,新建IDBSession.tt模板 Ctrl+S后自动生成IDBS ...