在泛型编程还是STL的实际运用中,迭代器(iterator)无疑扮演者重要的角色。迭代器是一种类似于指针的对象(如可以内容提领,成员访问等),但他又不仅仅是一种普通的指针。

关于迭代器失效,我们可以看下面这个例子:
#include<vector>
#include<list>
void PrintVector(const vector<int>& v)
{
vector<int>::const_iterator it = v.begin();
while (it!=v.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
void TestIterator()
{
//迭代器失效
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(2);
v.push_back(4);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(4);
v.push_back(4);
v.push_back(6);
vector<int>::iterator it = v.begin();
while (it != v.end())
{
if (*it % 2 == 0)
{
it = v.erase(it);
++it;
}
}
PrintVector(v);
}
void main()
{
TestIterator();
}
这样的代码乍一看好像没有什么问题,但是他是有问题的,因为在vector是顺序存储的,在vector中删除一个元素之后,我们需要为vector重新分配一个空间,存放在旧的空间的元素被复制到新的空间,如果删除的这个元素的迭代器会指向下一个元素之后还++it,则在复制的时候找不到下一个元素,因此会使删除点及删除点之后的迭代器失效。
正确做法是:
vector<int>::iterator it = v.begin();
while (it != v.end())
{
if (*it % 2 == 0)
{
it = v.erase(it);
}
else
{
++it;
}
}
PrintVector(v);
对于添加元素也是同理,如果当前容器中有10个元素,现在又要添加元素到容器中,如果内存中没有多余的空间,因此vector需要重新开辟空间来存储原来的元素以及新添加的元素。在新的空间复制原理来的元素,并插入新的元素,最后撤销原来的空间,这种情况发生会使所有迭代器都失效。
总结:vector迭代器的几种失效的情况:
1、当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。
2、当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操 作返回的迭代器都会失效。
3、当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效。
以上就是小编为大家带来的关于vector迭代器失效的几种情况总结全部内容了,希望大家多多支持~
# vector
# 迭代器失效
# C++中vector迭代器失效问题详解
# c++迭代器失效的情况汇总
# vector list map 遍历删除制定元素 防止迭代器失效的实例
# 浅谈c++ stl迭代器失效的问题
# C/C++迭代器的失效问题详解
# 迭代
# 是一种
# 几种
# 会使
# 提领
# 放在
# 是有
# 找不到
# 中有
# 但他
# 我们可以
# 也将
# 又要
# 这种情况
# 又不
# 则在
# 类似于
# 什么问题
# 小编
# 到新
相关文章:
制作农业网站的软件,比较好的农业网站推荐一下?
做企业网站制作流程,企业网站制作基本流程有哪些?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
如何通过cPanel快速搭建网站?
ppt制作免费网站有哪些,ppt模板免费下载网站?
学校建站服务器如何选型才能满足性能需求?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
已有域名如何免费搭建网站?
平台云上自助建站如何快速打造专业网站?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
c++ stringstream用法详解_c++字符串与数字转换利器
javascript基本数据类型及类型检测常用方法小结
北京制作网站的公司,北京铁路集团官方网站?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
智能起名网站制作软件有哪些,制作logo的软件?
建站10G流量真的够用吗?如何应对访问高峰?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
建站主机无法访问?如何排查域名与服务器问题
公司网站设计制作厂家,怎么创建自己的一个网站?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
相册网站制作软件,图片上的网址怎么复制?
如何自定义建站之星模板颜色并下载新样式?
如何挑选优质建站一级代理提升网站排名?
历史网站制作软件,华为如何找回被删除的网站?
如何选择高效可靠的多用户建站源码资源?
如何在景安云服务器上绑定域名并配置虚拟主机?
如何选择美橙互联多站合一建站方案?
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
音乐网站服务器如何优化API响应速度?
如何解决VPS建站LNMP环境配置常见问题?
高防服务器:AI智能防御DDoS攻击与数据安全保障
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
中山网站制作网页,中山新生登记系统登记流程?
广州营销型建站服务商推荐:技术优势与SEO优化解析
建站之星安装模板失败:服务器环境不兼容?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
建站主机与服务器功能差异如何区分?
如何在宝塔面板中修改默认建站目录?
高端企业智能建站程序:SEO优化与响应式模板定制开发
建站之星后台密码如何安全设置与找回?
如何快速搭建虚拟主机网站?新手必看指南
宝塔面板如何快速创建新站点?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何使用Golang安装API文档生成工具_快速生成接口文档
家具网站制作软件,家具厂怎么跑业务?
香港服务器WordPress建站指南:SEO优化与高效部署策略
如何规划企业建站流程的关键步骤?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
*请认真填写需求信息,我们会在24小时内与您取得联系。