本篇内容主要讲解“C++Vector迭代器失效问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++Vector迭代器失效问题如何解决”吧!主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装。比如:免费云主机域名vector的迭代器就是原生态指针T*。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)。凡是涉及到扩容操作,都有可能引起迭代器失效,因为vector扩容是分配一个新的数组,然后全部元素移到新的数组中。下面我们就以Insert函数来举例说明!示例1:程序崩溃!代码解释:如果我们没有预先分配空间,那么在insert的时候会发生扩容,根据我们模拟实现vector可知,STL标准库的vector中insert函数是实现了对迭代器的更新,但是形参列表没有使用输出型参数,所以我们只有通过返回值来接收新的迭代器!示例2:如果我们用返回值来接受新的迭代器,则不会崩溃!6:6
9:9
1 20 2 3 20 4 5 20 6
请按任意键继续. . .代码解释:STL中的insert如果发生了扩容是实现了对it位置的更新,并用返回值输出了形参的改变。示例3:如果我们预先预留(reserve)了空间,再插入过程中没发生扩容,那么自然也不会失效了。一般vector删除数据,都不考虑缩容的方案。缩容方案: size()
示例4:代码解释:可见代码确实是实现了删除,但是程序却崩了,原因就是erase后pos失效了,pos的意义变了,(但是在不同平台下对于访问pos的反应是不一样的,因此我们使用的时候要特别小心,统一以失效的角度去看待)。但如果不访问pos指向的内容就不会崩溃!erase导致的失效:erase失效都是意义变了。一般不会有缩容方案,那么erase的失效,一般也不存在野指针的失效。下面我们举个实例:要我们删除容器中所有偶数:示例5:代码解释:毫无疑问上诉代码会崩溃,因为erase后迭代器it所指向的位置失效,(虽然感觉是可以继续使用的,但在vs下就是不可以使用,在Linux下就可以对这个位置进行访问),所以下面我们用返回值来更新迭代器。示例6:1 3 5
请按任意键继续. . .代码解释:可见成功的删除了其中的偶数!其中缘由:erase删除pos位置元素后,pos位置之后的元素会往前移动,没有导致底层空间的改变,理论上讲迭代器不会失效,但是如果pos位置刚好是最后一个元素,删完之后pos刚好是end的位置,而end的位置是没有有效元素的,那么pos就失效了。因此删除vector中任意位置元素时,vs均认为该位置上迭代器失效了!除erase导致意义失效外,insert也可能导致意义失效,但是编译器却检查不出来!!!示例7:0:0
4:10
5:10
20
101 10 2 3 4代码解释:同样地,不是因为扩容而引起的意义失效,这个时候我们访问了pos指向的位置,编译器却不报错,但此时并不意味着一定对,后续如果进一步操作,还是会发生各种各样的错误!到此,相信大家对“C++Vector迭代器失效问题如何解决”有了更深的了解,不妨来实际操作一番吧!这里是百云主机网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
相关推荐: Element-ui中el-table出现的表格错位如何解决
这篇文章主要介绍“Element-ui中el-table出现的表格错位如何解决”,在日常操作中,相信很多人在Element-ui中el-table出现的表格错位如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Element…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。