参考两篇文章:https://blog.csdn.net/skyroben/article/details/70877008

https://lichanghao.github.io/2016/08/01/C++%E4%B8%ADiterator%E5%A4%B1%E6%95%88%E7%9A%84%E9%97%AE%E9%A2%98/

迭代器是一种面向对象的广义指针,用于指向容器中或流中的对象。可以看做是一种指向数据的指针。

失效举例:

删除vector容器中的偶数

代码:

#include  <iostream>
#include <vector>
using namespace std;
void Printvector(vector<int> &l)
{
vector<int>::iterator it = l.begin();
while (it != l.end())
{
if (*it % == )
{
//l.erase(it); //(1) 1 输出之后崩溃
//it=l.erase(it); //(2) 1 3 5 输出之后崩溃
}
cout << *it << " ";
++it;
}
cout << endl;
}
void Testvector()
{
vector<int> l;
l.push_back();
l.push_back();
l.push_back();
l.push_back();
l.push_back();
l.push_back();
Printvector(l);
}
int main()
{
Testvector();
return ;
}

(1)程序输出1之后就崩溃的原因:

通过调试观察现象:

作者解释:明显可以看到使用erase删除某一个结点之后,vector迭代器虽然还是指向当前位置,而且也引起了元素前挪,但是由于删除结点的迭代器就已经失效,指向删除点后面的元素的迭代器也全部失效,所以不能对当前迭代器进行任何操作;需要对迭代器重新赋值或者接收erase它的返回值;

个人理解:迭代器类似于一个指针,指向数据为2的节点时数据被删除,而且没有给迭代器重新赋值,那么此时此迭代器的指向不明确,输出该迭代器位置及后边位置的数据会造成程序崩溃。

那么,如果给进行重新赋值

作者解释:使用it接收erase的返回值,假如vector最后一个元素为奇数按照(2)的方式运行程序是不会崩溃的,这里崩溃的原因就好像数组访问越界,因为元素6已经被删除,不属于vector(数组)了,而你还继续对指向它的指针解引用,所以程序崩溃。

个人理解:对it重新赋值后,遍历到6的位置时不会崩溃,但因为删除6节点后没有重新赋值,造成崩溃。

STL中erase实现的源代码:

 iterator erase(iterator position) {
if (position + != end())
copy(position + , finish, position);
--finish;
destroy(finish);
return position;
}

(3)正确的使用方式

void Printvector(vector<int> &l)
{
vector<int>::iterator it = l.begin();
while (it != l.end())
{
if (*it % == )
{
it = l.erase(it);
}
else
{
cout << *it << " ";
++it;
}
}
cout << endl;
}

即只有在it指向明确的时候才进行输出,否则不输出

最新文章

  1. 【转】Caffe初试(八)Blob,Layer和Net以及对应配置文件的编写
  2. ElasticSearch返回不同的type的序列化
  3. C# 自动运行代码 (创建windows 服务的形式 )
  4. HDU 5950 矩阵快速幂
  5. MS10-046漏洞测试
  6. 静态页分页功能js代码
  7. iOS 取得单张系统图片
  8. Ubuntu安装node.js
  9. PostBack与IsPostBack区别
  10. nginx的使用配置
  11. kali nessus 安装插件失败解决方法
  12. Node.JS开发环境准备
  13. ●BOZJ 2229 [Zjoi2011]最小割
  14. epoll ET(边缘触发) LT(水平触发)
  15. MBA(它是指营销策划,领导力和影响力,财务会计,战略和转型的IT,企业融资,用于决策的数据分析识别市场趋势获得业务优势,全球商业战略)
  16. day2 --&gt; pyc 文件
  17. Shell-14--awk
  18. 浅析JavaScript正则表达式
  19. luogu2542 航线规划 (树链剖分)
  20. EMACS快捷键

热门文章

  1. Excel 批量出来数据
  2. vsftp服务器搭建
  3. java中的位运算及移位运算
  4. 【sqli-labs】 less43 POST -Error based -String -Stacked with tiwst(POST型基于错误的堆叠变形字符型注入)
  5. C# 从小到大排列
  6. day009 文件操作
  7. 如果说需要注册数据中心,这样才能使用demo部署数据中心license证需要申请,使用云之间-工作流程......
  8. 值得收藏--GitHub Top 20 开源项目
  9. centos 配置svn http serve
  10. Centos 7.x 源码编译搭建Nginx