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

网站工程师培训价格百度怎么精准搜索

网站工程师培训价格,百度怎么精准搜索,中国建设银行网站荆门网点查询,淘宝客网站主题下载vector 迭代器失效 迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T* 。因此迭代器失效,实际就是迭代器底层对应指针所指向…

vector 迭代器失效

迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T* 。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间 , 造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)。
在这里插入图片描述

对于vector可能会导致其迭代器失效的操作有:

指定位置元素的删除操作–erase

VS下的

#include <iostream>
using namespace std;
#include <vector>
int main()
{int a[] = { 1, 2, 3, 4 };vector<int> v(a, a + sizeof(a) / sizeof(int));int sz = v.capacity();// 使用find查找3所在位置的iteratorvector<int>::iterator pos = find(v.begin(), v.end(), 3);// 删除pos位置的数据,导致pos迭代器失效。v.erase(pos);cout << *pos << endl; // 此处会导致非法访问return 0;
}

在这里插入图片描述
在这里插入图片描述

erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了。因此删除vector中任意位置上元素时,vs就认为该位置迭代器失效了。

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

#include <iostream>
#include <string>
using namespace std;
int main()
{string s("hello");auto it = s.begin();// 放开之后代码会崩溃,因为resize到20会string会进行扩容// 扩容之后,it指向之前旧空间已经被释放了,该迭代器就失效了// 后序打印时,再访问it指向的空间程序就会崩溃//s.resize(20, '!');while (it != s.end()){cout << *it;++it;}cout << endl;it = s.begin();while (it != s.end()){it = s.erase(it);// 按照下面方式写,两编译器运行时程序都会崩溃,因为erase(it)之后// it位置的迭代器就失效了// s.erase(it); //++it;}return 0;
}

Linux下,g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端。

// 2. erase删除任意位置代码后,linux下迭代器并没有失效
// 因为空间还是原来的空间,后序元素往前搬移了,it的位置还是有效的
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{vector<int> v{1,2,3,4,5};vector<int>::iterator it = find(v.begin(), v.end(), 3);v.erase(it);cout << *it << endl;while(it != v.end()){cout << *it << " ";++it;}cout << endl;return 0;
}

在这里插入图片描述

//erase删除的迭代器如果是最后一个元素,删除之后it已经超过end
// 此时迭代器是无效的,++it导致程序崩溃
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{vector<int> v{1,2,3,4,5};// vector<int> v{1,2,3,4,5,6};auto it = v.begin();while(it != v.end()){if(*it % 2 == 0)v.erase(it);++it;}for(auto e : v){cout << e << " ";}cout << endl;return 0;
}

使用第一组数据时,程序可以运行
在这里插入图片描述
使用第二组数据时,程序最终会崩溃
在这里插入图片描述
从上述二个例子中可以看到:SGI STL中,迭代器失效后,代码并不一定会崩溃,但是运行结果肯定不对,如果it不在begin和end范围内,肯定会崩溃的。
迭代器失效,不要在访问了,行为结果未定义(不同的编译器有不同的实现)

http://www.laogonggong.com/news/21290.html

相关文章:

  • 成都规划网站网络营销推广活动有哪些
  • app开发cms网站开发外贸推广营销公司
  • 网站上的flash怎么做惠州百度seo在哪
  • 网站愉建设seo sem推广
  • 网络哪里能接活做网站万能bt搜索引擎
  • 做网站项目如何实现支付seo策略分析
  • 学校网站 aspx源码电视剧百度搜索风云榜
  • 织梦搬家 网站空白站点
  • 做餐饮系统网站建设什么推广方法是有效果的
  • 中山企业网站制作公司手机网站搜索优化
  • 白银网站seo怎么免费制作网页
  • 福州有做网站引流的吗沈阳专业seo关键词优化
  • 台山网站开发网络营销顾问工作内容
  • 可以做仿牌网站手机百度关键词优化
  • 长沙做网站公司 上联网络百度关键词首页排名服务
  • 做代炼的网站谷歌排名算法
  • 做旅游网站多少钱软文街怎么样
  • 家教网站制作网站友情链接是什么
  • 高校建设思政教育网站案例杭州seo排名
  • 一起做网店一件代发网长沙seo行者seo09
  • 三星做号网站百度推广售后
  • 落实网站建设培训班精神运营推广怎么做
  • 合肥最好的网站建设公司排名百度手机卫士
  • 惠州网站建设公司怎样建立网站免费的
  • WordPress默认模板做的站职业技能培训机构
  • 站优云网络公司seo去哪里培训
  • 怎么做样网站打开浏览器直接进入网站
  • 喜欢做网站的行业杭州网站优化咨询
  • 巨量千川推广怎么收费seo排名培训
  • 互联网创意网站有哪些方面免费网络空间搜索引擎