vector迭代器失效的一种情形
使用过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迭代器失效的一种情形的更多相关文章
- vector迭代器失效的几种情况
在泛型编程还是STL的实际运用中,迭代器(iterator)无疑扮演者重要的角色.迭代器是一种类似于指针的对象(如可以内容提领,成员访问等),但他又不仅仅是一种普通的指针.关于迭代器失效,我们可以看下 ...
- C++迭代器失效的几种情况总结
一.序列式容器(数组式容器) 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效.这是因为vetor,deque ...
- C++vector迭代器失效的问题
转载:http://blog.csdn.net/olanmomo/article/details/38420907 转载:http://blog.csdn.net/stpeace/article/de ...
- 【转-mysql索引失效的几种情形】
索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件 ...
- STL容器迭代器失效问题讨论
STL源码剖析---迭代器失效小结 vector迭代器的几种失效的情况: .当插入(push_back)一个元素后,end操作返回的迭代器肯定失效. .当插入(push_back)一个元素后,capa ...
- c++ 迭代器失效学习 effective-STL 9条
https://www.cnblogs.com/newbeeyu/p/6883122.html 结合 effective STL 条款9 https://www.cnblogs.com/fnlin ...
- C++之迭代器失效总结
1. 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效.这是因为vetor,deque使用了连续分配的内存,删 ...
- c++之迭代器失效
1.首先从一到题目开始谈说起迭代器失效.有时我们很自然并且自信地 用下面方法删除vector元素: #include <iostream>#include <stdio.h># ...
- 容器大小的改变以及容器操作可能使迭代器失效、vector对象的容量变化
1 改变容器的大小 我们可以使用resize来增加或缩小容器,与往常一样,array不支持resize.如果当前大小大于所要求的大小,容器后面的元素会被删除:如果当前大小小于新大小,会将新元素添加到容 ...
随机推荐
- 【POJ2739】Sum of Consecutive Prime Numbers
简单的素数打表,然后枚举.开始没注意n读到0结束,TLE了回..下次再认真点.A过后讨论里面有个暴力打表过的,给跪了! #include <iostream> #include <c ...
- 无心插柳OR志在必得?阿里推“来往”的意图
近年来,阿里巴巴在外围的动作确实不少,投资新浪微博.投资陌陌,配合阿里自身的一些战略调整,让人觉得这家公司似乎正在经历一场前所未有的“蜕变”.其实这也不难理解,在BAT三国演义中,任何一方都不 ...
- Linux下redis的安装及用法
1.下载源代码包redis-2.8.21.tar.gz,并将其上传到指定文件夹/urs/src,然后对其进行解压: [root@Slave1pc src]# tar -xvf redis-2.8.21 ...
- js中取session的值
在js中貌似不能取session的值,我在后台设置的session一直拿不到,于是用间接的方式拿到session的值. 首先在jsp中嵌入java代码,用java设置一个变量来取session值,再在 ...
- mybatis参数查询
单个参数查询 在mapper.xml配置文件中配置 <select id= "selectByNu" paramet ...
- python -序列化
python中用于序列化的两个模块 json 用于[字符串]和[python基本数据类型]之间进行转换 pickle 用于[python特有的类型] 和 [python基本数据类型]间进行转换 Jso ...
- 伪元素first-letter(首字母变大)
让首字母变大 <p>Do you like to ride a bicycle?</p> p:first-letter{ font-size: 34px; }
- App签名--- Android
步骤: 下面就Next即可
- Pull生成&解析
开篇注意,由于解析有可能有大文件非常耗时,建议另开一个线程解析也可以不开具体视情况而定 Pull生成 1.通过xml获得序列化的实例 XmlSerializer nxs = Xml.newSe ...
- Android PackageManager基础知识
一.PackageManagerService启动过程 SystemServer首先启动,创建一个ServerThread线程来启动所有Android核心服务,其中PackageManagerServ ...