当前位置: 首页 > news >正文

网站代理建设设计工作室名字

网站代理建设,设计工作室名字,如何做电商设计,wordpress end_lvl目录 什么是迭代器失效导致迭代器失效的操作VS和g环境下对与迭代器失效的态度 什么是迭代器失效 迭代器的底层其实就是一个指针,或者对指针进行了封装 vector的迭代器就是一个指针T* 一个迭代器指向某一个空间,此时这块空间被释放了,这个迭…

目录

  • 什么是迭代器失效
  • 导致迭代器失效的操作
  • VS和g++环境下对与迭代器失效的态度

什么是迭代器失效

迭代器的底层其实就是一个指针,或者对指针进行了封装

vector的迭代器就是一个指针T*
一个迭代器指向某一个空间,此时这块空间被释放了,这个迭代器仍指向原来的那个空间,这个就叫迭代器的失效

如果继续使用已经失效的迭代器,程序可能会崩溃

在这里插入图片描述


导致迭代器失效的操作

引起底层空间发生变化的操作,都很有可能引起迭代器失效

迭代器失效,主要都是由inserterase导致的



下面我们看一个insert导致迭代器失效的情况

我们首先定义一个vector<int>对象和一个迭代器

void test6()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();
}

此时v的size()的值和capacity()的值都为6,如果再向v中插入数据,就需要扩容。

void test6()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();v.insert(it, 0);//此处会扩容
}

v.insert(it, 0)会导致扩容,扩容其实就是另开辟一块更大空间,原空间销毁,所以此时迭代器it已经失效了,因为后面没有再使用it,所以暂时不会报错。
在这里插入图片描述

在这里插入图片描述


此处如果再使用已经失效的迭代器it,就会报错

void test6()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();v.insert(it, 0);//此处会扩容v.insert(it, 0);
}

在这里插入图片描述
所以想要迭代器不失效,就要为迭代器重新赋值

insert函数在库中的定义为:

iterator insert (iterator position, const value_type& val)

可以看到它的返回值是iterator类型的,这其实返回了一个处理后不失效的迭代器,是指向第一个新插入元素的迭代器。

void test6()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin();it = v.insert(it, 0);//此处会扩容v.insert(it, 10);//不会报错
}




下面看一下erase导致失效的情况:

其实大多数情况下,使用erase并不会导致迭代器

void test7()
{vector<int> v{ 1,2,3,4,5,6 };auto it = v.begin()+3;v.erase(it);
}

这里迭代器it指向的是4,v.erase(it)删除4后,后面的元素会向前补上来,没有导致底层空间的改变,理论上讲迭代器不应该会失效
在这里插入图片描述

如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了
在这里插入图片描述

以及,如果vector中如果只有一个元素,迭代器恰好指向这个元素,那么erase后,迭代就会失效

可以看出,erase虽然有的情况会导致迭代器失效,有点情况不会导致迭代器失效,但是在VS环境下就认为:删除vector中任意位置上元素时,vs就认为该位置迭代器失效了。



其实与vector类似,string在插入+扩容操作+erase之后,迭代器也会失效




VS和g++环境下对与迭代器失效的态度

  • VS环境下,对于迭代器失效十分严格,只要有迭代器失效的情况,编译器就会报错;只要删除vector中任意位置上元素时,就认为该位置迭代器失效了,报错
  • 但是linux上的g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端。
    • 扩容之后,迭代器已经失效了,程序虽然可以运行,但是运行结果已经不对了
    • erase删除任意位置代码后,linux下如果迭代器没有失效,程序还是会运行
    • erase删除的迭代器如果是最后一个元素,删除之后it已经超过end,如果++it还是会报错的
    • 所以迭代器失效后,代码并不一定会崩溃,但是运行结果肯定不对,如果it不在begin和end范围内,肯定会崩溃的
http://www.yayakq.cn/news/988560/

相关文章:

  • 网站app制作中国制造网官网入口
  • 建设科技网络网站的意义和目的广州番禺网站制作公司
  • 一键免费生成网页的网站如何注册公司需要多少资金
  • 网站建设费用进会计什么科目wordpress手机主题漂亮
  • 网络平台建站流程外卖网站制作
  • 网站建设汕头阿里云域名注册官网入口
  • 合肥网站设计建设公司国际情况最新消息
  • 官方微网站吗网站注册页面html
  • 网站建设 sql国内做免费的视频网站
  • 永州建设学校官方网站长沙公司名称大全
  • 做h5网站用什么合肥房产网贝壳
  • wordpress链接提交表单网站推广优化方法
  • 在线个人资料制作网站苏州无名网络科技有限公司
  • 福建建设工程环保备案网站入口成都网站建设服务公司
  • 伴奏在线制作网站阿里云网站建站
  • 网站排名诊断小程序定制
  • 网页与网站的关系外贸建站用什么服务器
  • 织梦手机网站图片宣传网站开发
  • 打电话问网站建设推广那个网站做问卷好
  • 成都市微信网站建设公司视觉元素网站
  • 中山cp网站建设wordpress删除页头页尾
  • 广东省建设监理协会网站 - 首页wordpress 安装脚本
  • 网站怎样恶意刷搜索引擎营销方案例子
  • 只有单页面的网站怎么做seo做网站用win还是li
  • 两个域名 两个网站 如何推广学会建网站如何做网络营销
  • 南宁企业网站排名优化佛山网络推广平台
  • 东莞市做网站公司网站关键词排名怎么提升
  • 站规划在网站建设中的作用网站部分频道完全不收录了怎么做
  • html网站模板设计本接单大厅
  • 做公司网站的费用计入什么科目wordpress 内存超限