条目二十八《正确理解由reverse_iterator的base()成员函数所产生的iterator的用法》

迭代器的种类一共有四种,上面已经说过了。这里就不再次写出来。

这一个条目主要是reserce_iterator和iterator的转换。可以使用base()函数来把前者转换为后者。

比如在拥有reserve_iterator,但需要用到插入,删除成员函数,那么这两个是不接受reserve_iterator作为参数的,所以需要转换为iterator再进行下一步的插入和删除元素。


以上代码得到的实际元素排布如下图:

首先应了解,通过base()得到的迭代器,只是把rbegin 和rend位置调换,然后整体向右移动一个地址。所以这样会造成调用base()迭代器指向的位置不一致,iterator会比reserve_iterator右移一位。

插入操作
这样在插入的时候,因为是在迭代器指向前插入新元素的,所以两种迭代器的结果是一样的。

删除操作
由于调用base()后的迭代器指向不一样,所以删除元素的结果是不一样的。

解决方法:

  • 1.看起来“可行的”。

    这种方法在vwctor和string的时候有些stl实现会编译出错。因为它们的底层实现是迭代器是一根指针。

    C和C++都规定了从函数返回的指针不应该被修改

  • 2.最优的方法。

    这种方法是,既然base()后你迭代器的指向后移一位,那么我就先往前一位再调用base(),这样得到的迭代器就是reserve_iterator和iterator的指向是一致的。

通过base()函数可以得到一个与reverse_iterator“相对应的”iterator的说法并不准确。对于插入操作,这种对应关系确实存在;但是对于删除操作,情况却并非如此简单。当你将一个reverse_iterator转换成iterator的时候,很重要的一点是,你必须很清楚你将要对该iterator执行什么样的操作,因为只有在此基础上,你才能够确定这个iterator是不是你所需要的iterator。

条目二十八《正确理解由reverse_iterator的base()成员函数所产生的iterator的用法》的更多相关文章

  1. 条目二十六《iterator优先于const_iterator、reverse_iterator以及const_reverse_iterator》

    条目二十六<iterator优先于const_iterator.reverse_iterator以及const_reverse_iterator> 这几个东西不是类型来的,而是不同的类,所 ...

  2. 条目二十二《切勿修改set或multiset的键》

    条目二十二<切勿修改set或multiset的键> 所有的标准关联容器一样,set和multiset按照一定的顺序来存放自己的元素,而这些容器的正确行为也是建立在其元素保持有序的基础之上的 ...

  3. Bootstrap <基础二十八>列表组

    列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...

  4. Web 前端开发人员和设计师必读文章推荐【系列二十八】

    <Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  5. Citrix 服务器虚拟化之二十八 XenApp6.5发布文档内容

    Citrix 服务器虚拟化之二十八  XenApp 6.5发布文档内容 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1)  服务器桌面:发布场中服务器的整个 ...

  6. WCF技术剖析之二十八:自己动手获取元数据[附源代码下载]

    原文:WCF技术剖析之二十八:自己动手获取元数据[附源代码下载] 元数据的发布方式决定了元数据的获取行为,WCF服务元数据架构体系通过ServiceMetadataBehavior实现了基于WS-ME ...

  7. VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器

    VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器 View 传输服务器用于管理和简化数据中心与在最终用户本地系统上检出使用的 View 桌面之间的数据传输.必须安 ...

  8. Bootstrap入门(二十八)JS插件5:工具提醒

    Bootstrap入门(二十八)JS插件5:工具提醒 工具提示在使用过程中比较常见,但是实现起来有些麻烦,而bootstrap则很好地解决了这个问题. 我们来写一个简单的实例 先引入CSS文件和JS文 ...

  9. mysql进阶(二十八)MySQL GRANT REVOKE用法

    mysql进阶(二十八)MySQL GRANT REVOKE用法   MySQL的权限系统围绕着两个概念: 认证->确定用户是否允许连接数据库服务器: 授权->确定用户是否拥有足够的权限执 ...

随机推荐

  1. 226. Invert Binary Tree 翻转二叉树

    [抄题]: Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 [暴力解法]: 时间分析: 空间分 ...

  2. [erlang 002]gen_server中何时会跑到terminate函数

    一.从start方法产出的独立gen_server进程 实验代码: %%%-------------------------------------- %%% @Module  : %%% @Auth ...

  3. spring+springmvc+mybatis+redis 实现两重数据缓存

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...

  4. Python使用struct处理二进制(pack和unpack用法)

    转载自:http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html 这篇文章写的很好,所以无耻的转了.. 有的时候需要用python处理二进 ...

  5. code1064 虫食算

    dfs搜索每个字母对应的数字 剪枝: 1.当一列上三个数a b c都已知时,如果 (a+b)%n!=c && (a+b+1)%n!=c 剪枝(+1是考量进位,注意&&) ...

  6. Fix “Could Not Find This Item” When Deleting in Windows 7

    If you’ve been using Windows for as long as I have, you have probably run into your share of weird e ...

  7. 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明.RP

    1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...

  8. HDU 4514 湫湫系列故事――设计风景线 (树形DP)

    题意:略. 析:首先先判环,如果有环直接输出,用并查集就好,如果没有环,那么就是一棵树,然后最长的就是树的直径,这个题注意少开内存,容易超内存, 还有用C++交用的少一些,我用G++交的卡在32764 ...

  9. python中return的用法

    def testReturn(x): if x > 10000: return print "test return!!" #这句话永远不会得到执行 elif x > ...

  10. System.Timers.Timer用法

    System.Timers.Timer t = new System.Timers.Timer(5000); //设置时间间隔为5秒 private void Form1_Load(object se ...