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

条目二十八《正确理解由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。

原文地址:https://www.cnblogs.com/liangjf/p/10634071.html

时间: 2024-10-12 14:08:10

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

工作那些事(二十八)项目管理模式:项目类型、函数类型、矩阵

在一个项目中,,项目经理很少有正确的,能够使用哪些资源.式,项目管理模式由公司的CTO来决定. 简而言之,项目管理有三种模式:项目型.职能型.矩阵型. 以下先看看这三种模式,对项目经理来说都是什么作用. 1项目型 将全部的能兵强将集结在一起,財务部.业务部.IT管理部等的精英们脱离原有的岗位. 形成一个正式的部门,并由项目经理领导. 这种优势是项目经理的权利非常强.资源充足.全部的项目经理都希望有这种团队. 可是就公司而言.单独团队对公司总体资源的浪费.是显而易见的:对被抽调的个人而言.脱离了原

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

条目二十六<iterator优先于const_iterator.reverse_iterator以及const_reverse_iterator> 这几个东西不是类型来的,而是不同的类,所以强制转换的话是不行的,所以别把C风格的强制转换类型用在这里. 它们之间存在着隐式转换. iterator -> const_iterator iterator -> reverse_iterator const_iterator -> const_reverse_iterator 或者显示

纯干货!二十八道BATJ大厂Java岗之"多线程与并发"面试题分享

年底了,又到了跳槽季啦,该刷题走起了.这里总结了一些被问到可能会懵逼的面试真题,有需要的可以看下- 一.进程与线程 进程是资源分配的最小单位,线程是cpu调度的最小单位.线程也被称为轻量级进程. 所有与进程相关的资源,都被记录在PCB中 进程是抢占处理及的调度单位:线程属于某个进程,共享其资源 一个 Java 程序的运行是 main 线程和多个其他线程同时运行. 二.Thread中的start和run方法的区别 调用start()方法会创建一个新的子线程并启动 run()方法只是Thread的一

angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入angular-resource.min.js文件 2.在模块中依赖ngResourece,在服务中注入$resource var HttpREST = angular.module('HttpREST',['ngResource']); HttpREST.factory('cardResource

【管理心得之二十八】事物的本质,到底离我们有多远?

场景再现 =========================== {某企业,自主研制精密仪器实验室} Leader :{小李}怎么搞得,按照说明书操作,怎么还把仪器搞坏了? 小李     :是我操作Miss. Leader :念你是初犯,这次就不追究了,总结教训不要再有下次了.同样错误如果犯两次,那就是你个人态度问题了. 小李     :嗯,我知道了. {小王插言说} 小王     :半年前,你没来之前,{小张}也犯过同样的Miss. Leader :是吗? Leader :大家要以此为戒,继续

QT开发(二十八)——QT常用类(二)

QT开发(二十八)--QT常用类(二) 一.QDir 1.QDir简介 QDir提供对目录结构及其内容的访问. QDir通过相对或绝对路径指向一个文件. 2.QDir成员函数 QDir主要成员函数如下: QDir::QDir ( const QDir & dir ) QDir::QDir ( const QString & path = QString() ) Dir::QDir ( const QString & path, const QString & nameFil

二十八个 HTML5 特性与技巧

1. New Doctype  你还在使用令人讨厌的难记的XHTML文档类型声明吗?<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd>如果还在用,为什么呢?如同Douglas Quaid所说,转到新的HTML5这种文档类型吧,它会使你看起来更年轻.实际上,你当真知道XHTML的文档类型声明

攻城狮在路上(叁)Linux(二十八)--- 打包命令:tar

首先介绍一下tar打包命令的基本格式,下面的三种之间不能混淆. tar [-j|-z] [cv] [-f 新文件名] file1 file2 ...; tar [-j|-z] [tv] [-f 新文件名]; <== 查看文件名 tar [-j|-z] [xv] [-f 新文件名] [-C 目录]; <== 解包 参数说明: -c:新建打包文件,搭配-v来查看过程中被打包的文件名 -t:查看打包文件的内容包含哪些文件名 -x:解包或解压缩功能.可搭配大写C来指定解压目录 ------------

二十八条社会潜规则

今天登录简书逛了一会,无意中看到一篇有意思的文章,感觉有点道理,于是顺便摘抄了下来,与大家共勉. 二十八条社会潜规则:先学会不生气,再学会气死人 1.能在一定位置上的人,一定有他的过人之处,不管你多么讨厌他. 2.要想屏蔽某些人的朋友圈,最好把他同事微信分到一个组里,要屏蔽一起都屏蔽了. 3.不要总在旁人面前提你的朋友多牛逼,你要懂得,别人的成就与你无关. 4.朋友同事之间,帮忙是情分,不帮忙是本分,不要把别人对你的好,当作理所当然. 5.和同事拼单买东西叫外卖,一定把支付明细的截图发给每个人,