关于vector迭代器失效的几种情况总结

发布时间 - 2026-01-10 22:01:03    点击率:

在泛型编程还是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++迭代器的失效问题详解  # 迭代  # 是一种  # 几种  # 会使  # 提领  # 放在  # 是有  # 找不到  # 中有  # 但他  # 我们可以  # 也将  # 又要  # 这种情况  # 又不  # 则在  # 类似于  # 什么问题  # 小编  # 到新 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现一对一模型关联?(Eloquent示例)  如何用已有域名快速搭建网站?  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Angular 表单中正确绑定输入值以确保提交与验证正常工作  黑客如何利用漏洞与弱口令入侵网站服务器?  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  如何正确选择百度移动适配建站域名?  如何快速生成橙子建站落地页链接?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  java获取注册ip实例  怎么用AI帮你设计一套个性化的手机App图标?  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  浅谈javascript alert和confirm的美化  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  javascript基于原型链的继承及call和apply函数用法分析  如何获取PHP WAP自助建站系统源码?  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  如何在万网开始建站?分步指南解析  网站制作大概多少钱一个,做一个平台网站大概多少钱?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  nginx修改上传文件大小限制的方法  如何在宝塔面板创建新站点?  百度浏览器如何管理插件 百度浏览器插件管理方法  Linux安全能力提升路径_长期防护思维说明【指导】  海南网站制作公司有哪些,海口网是哪家的?  如何快速配置高效服务器建站软件?  Laravel如何处理异常和错误?(Handler示例)  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  Laravel如何使用Livewire构建动态组件?(入门代码)  使用spring连接及操作mongodb3.0实例  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Laravel中的Facade(门面)到底是什么原理  创业网站制作流程,创业网站可靠吗?  如何用低价快速搭建高质量网站?  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  原生JS获取元素集合的子元素宽度实例  如何用AI帮你把自己的生活经历写成一个有趣的故事?  微信小程序 canvas开发实例及注意事项  jQuery validate插件功能与用法详解  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  IOS倒计时设置UIButton标题title的抖动问题  香港服务器建站指南:免备案优势与SEO优化技巧全解析  C语言设计一个闪闪的圣诞树  制作电商网页,电商供应链怎么做?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?