使用过STL的人都应该知道关于迭代器失效的原理,这里以后vector迭代器失效为例:

第一种:当插入一个元素到vector中,如果插入后容器已满,那么容器将新开辟一块内存区域,然后

将原内存中的数据拷贝到新的内存区域,同时释放旧的内存。这样之前指向旧内存的迭代器就会指向

不确定内存,这块内存要么释放,要么释放后又用作其他用途。这便导致了迭代器失效。

第二种:当删除容器中一个元素后,该迭代器所指向的元素已经被删除,那么也造成迭代器失效。

这里我们主要讨论下第二种情况。

我们先举个例子说明:

比如vector中存储了1,2,3,4,5,6,7,8,9,10

假如此时迭代器指向6.

当我们erase这个迭代器的元素后,vecotr被删除元素后面的元素会依次前移动。

变为1,2,3,4,5,7,8,9,10 此时迭代器指向元素7 也就是被删除元素的下一个元素。

所以当我们用以下测试代码测试的时候,发现会出现错误:

 #include <iostream>
#include <vector>
using namespace std; int main(int argc, char* argv[])
{
std::vector<int> v1;
for(int i = ;i <= ;i++)
{
v1.push_back(i);
} for(vector<int>::iterator it = v1.begin();it != v1.end();)
{
if(*it==)
{
v1.erase(it);
}
else
{
it++;
}
} for(it = v1.begin();it != v1.end();it++)
{
cout<<*it<<",";
}
cout<<endl;
return ;
}

因为删除元素的所指的迭代器已经失效

但是由于erase方法会返回下一个有效的迭代器。所以

我们再每次删除后让迭代器重新被erase返回即可。

所以修改后的代码如下:

 #include <iostream>
#include <vector>
using namespace std; int main(int argc, char* argv[])
{
std::vector<int> v1;
for(int i = ;i <= ;i++)
{
v1.push_back(i);
} for(vector<int>::iterator it = v1.begin();it != v1.end();)
{
if(*it==)
{
it=v1.erase(it);
}
else
{
it++;
}
} for(it = v1.begin();it != v1.end();it++)
{
cout<<*it<<",";
}
cout<<endl;
return ;
}

运行结果:

vector迭代器失效的一种情形的更多相关文章

  1. vector迭代器失效的几种情况

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

  2. C++迭代器失效的几种情况总结

    一.序列式容器(数组式容器) 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效.这是因为vetor,deque ...

  3. C++vector迭代器失效的问题

    转载:http://blog.csdn.net/olanmomo/article/details/38420907 转载:http://blog.csdn.net/stpeace/article/de ...

  4. 【转-mysql索引失效的几种情形】

    索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件 ...

  5. STL容器迭代器失效问题讨论

    STL源码剖析---迭代器失效小结 vector迭代器的几种失效的情况: .当插入(push_back)一个元素后,end操作返回的迭代器肯定失效. .当插入(push_back)一个元素后,capa ...

  6. c++ 迭代器失效学习 effective-STL 9条

    https://www.cnblogs.com/newbeeyu/p/6883122.html  结合 effective  STL 条款9 https://www.cnblogs.com/fnlin ...

  7. C++之迭代器失效总结

    1. 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效.这是因为vetor,deque使用了连续分配的内存,删 ...

  8. c++之迭代器失效

    1.首先从一到题目开始谈说起迭代器失效.有时我们很自然并且自信地 用下面方法删除vector元素: #include <iostream>#include <stdio.h># ...

  9. 容器大小的改变以及容器操作可能使迭代器失效、vector对象的容量变化

    1 改变容器的大小 我们可以使用resize来增加或缩小容器,与往常一样,array不支持resize.如果当前大小大于所要求的大小,容器后面的元素会被删除:如果当前大小小于新大小,会将新元素添加到容 ...

随机推荐

  1. poj 3684 Physics Experiment(数学,物理)

    Description Simon ), the first ball is released and falls down due to the gravity. After that, the b ...

  2. pyqt listview基础学习01

    from decimal import * from PyQt4.QtGui import * from PyQt4.Qt import * from PyQt4.QtCore import * im ...

  3. poj 1523 SPF(tarjan求割点)

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  4. java中数据流的简单介绍

    java中的I/O操作主要是基于数据流进行操作的,数据流表示了字符或者字节的流动序列. java.io是数据流操作的主要软件包 java.nio是对块传输进行的支持 数据流基本概念 “流是磁盘或其它外 ...

  5. HTML基础知识笔记(一)

    HTML定义 HTML指的是超文本标记语言 HTML不是编程语言,而是标记语言 标记语言是一套标记标签 HTML是用标记标签来描述网页   HTML标签1 <html></html& ...

  6. HTML - Textarea - 空格的问题解决方式

    第一种方式: <textarea name="textareaname" rows="XX" cols="XX" ></t ...

  7. Eclipse error:Access restriction

    报错:Access restriction: The method decodeBuffer(String) from the type CharacterDecoder is not accessi ...

  8. iOS 面试题 2

    1.         描述应用程序的启动顺序. 1.程序入口main函数创建UIApplication实例和UIApplication代理实例 2.在UIApplication代理实例中重写启动方法, ...

  9. 原创:C sharp 中 Enum的几点小 Tips

    (1)为什么要使用Enum? ♥ enums枚举是值类型,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存储.enum student{a,b,c,d,e},其中enum代表student为 ...

  10. web前端中实现多标签页切换的效果

    在这里,实现多标签页效果的方法有两个,一个是基于DOM的,另一个是基于jquery的,此次我写的是一个对于一个电话套餐的不同,显示不同的标签页 方法一: 首先,我们要把页面的大体框架和样式写出来,ht ...