关于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


相关推荐: 如何在云主机快速搭建网站站点?  进行网站优化必须要坚持的四大原则  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  android nfc常用标签读取总结  智能起名网站制作软件有哪些,制作logo的软件?  如何快速生成ASP一键建站模板并优化安全性?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  详解vue.js组件化开发实践  5种Android数据存储方式汇总  网页设计与网站制作内容,怎样注册网站?  Laravel如何使用Service Container和依赖注入?(代码示例)  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  香港网站服务器数量如何影响SEO优化效果?  MySQL查询结果复制到新表的方法(更新、插入)  Laravel如何实现API速率限制?(Rate Limiting教程)  php485函数参数是什么意思_php485各参数详细说明【介绍】  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Python文件流缓冲机制_IO性能解析【教程】  大同网页,大同瑞慈医院官网?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  晋江文学城电脑版官网 晋江文学城网页版直接进入  网站制作软件有哪些,制图软件有哪些?  如何在 React 中条件性地遍历数组并渲染元素  BootStrap整体框架之基础布局组件  高防服务器租用首荐平台,企业级优惠套餐快速部署  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel如何使用模型观察者?(Observer代码示例)  C语言设计一个闪闪的圣诞树  如何用VPS主机快速搭建个人网站?  用v-html解决Vue.js渲染中html标签不被解析的问题  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  详解jQuery中基本的动画方法  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  如何在阿里云高效完成企业建站全流程?  如何彻底删除建站之星生成的Banner?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  jQuery validate插件功能与用法详解  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  JavaScript如何实现路由_前端路由原理是什么  如何在云指建站中生成FTP站点?