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 也就是被删除元素的下一个元素。

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

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4
 5 int main(int argc, char* argv[])
 6 {
 7     std::vector<int> v1;
 8     for(int i = 1;i <= 10;i++)
 9     {
10         v1.push_back(i);
11     }
12
13     for(vector<int>::iterator it = v1.begin();it != v1.end();)
14     {
15         if(*it==6)
16         {
17             v1.erase(it);
18         }
19         else
20         {
21             it++;
22         }
23     }
24
25     for(it = v1.begin();it != v1.end();it++)
26     {
27         cout<<*it<<",";
28     }
29     cout<<endl;
30     return 0;
31 }

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

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

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

所以修改后的代码如下:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4
 5 int main(int argc, char* argv[])
 6 {
 7     std::vector<int> v1;
 8     for(int i = 1;i <= 10;i++)
 9     {
10         v1.push_back(i);
11     }
12
13     for(vector<int>::iterator it = v1.begin();it != v1.end();)
14     {
15         if(*it==6)
16         {
17             it=v1.erase(it);
18         }
19         else
20         {
21             it++;
22         }
23     }
24
25     for(it = v1.begin();it != v1.end();it++)
26     {
27         cout<<*it<<",";
28     }
29     cout<<endl;
30     return 0;
31 }

运行结果:

时间: 2024-12-06 10:00:16

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

vector迭代器失效的几种情况

在泛型编程还是STL的实际运用中,迭代器(iterator)无疑扮演者重要的角色.迭代器是一种类似于指针的对象(如可以内容提领,成员访问等),但他又不仅仅是一种普通的指针.关于迭代器失效,我们可以看下面这个例子: #include<vector>#include<list>void PrintVector(const vector<int>& v){    vector<int>::const_iterator it = v.begin();    

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

转载:http://blog.csdn.net/olanmomo/article/details/38420907 转载:http://blog.csdn.net/stpeace/article/details/46507451 转载:http://www.cnblogs.com/xkfz007/articles/2509433.html 转载:http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/13/2636375.html 有这样一个应用

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

索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 2.对于多列索引,不是使用的第一部分(第一个),则不会使用索引 3.like查询是以%开头 4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引 5.如果MySQL估计使用全表扫描要比使用索引快,则不使用索引 此外,查看索引的使用情况show stat

map和vector的迭代器失效问题

当删除一个STL容器(比如map, vector)中的某个元素时, 会引起迭代器失效, 所以, 我们务必提高警惕. 题目: 删除map<int, int>中value为5的倍数的元素. 该题看起来很自然很简单, 实则有迭代器失效的陷阱. 如果对迭代器失效问题一无所知, 则很容易写出如下的错误代码: 1 #include <iostream> 2 #include <map> 3 using namespace std; 4 5 typedef map<int, i

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

有的朋友肯定会问, m.erase(it++);就不会产生迭代器失效么? 确实不会! 为什么呢? 这样从it++说起, 为了简便起见, 我们用p++来代替吧. 看程序: #include <iostream> using namespace std; int main() { char szTest[] = "abcdefg"; char *p = szTest; cout << *p++ << endl; return 0; } 大家都知道, 结果

C++之迭代器失效总结

1. 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效.这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置.所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效的iterator. for (iter = cont.begin(); iter != cont.end();) { (*it)->doSomething(); if

c++之迭代器失效

1.首先从一到题目开始谈说起迭代器失效.有时我们很自然并且自信地 用下面方法删除vector元素: #include <iostream>#include <stdio.h>#include <vector>#include <algorithm>#include <string> void del_elem(vector<string> &vec, const char * elem) { vector<string&

转:STL迭代器失效问题

最近在项目开发中,遇到一个异常,经过测试,发现是迭代器失效问题,于是稍微总结了一下. vector迭代器失效测试: 测试程序: void vectorTest(){    vector<int> container;    for (int i = 0; i < 10; i++)    {        container.push_back(i);    } vector<int>::iterator iter;     for (iter = container.begi

C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用

序列性容器::(vector和list和deque) erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被 删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式,但是erase的返回值为下一个有效的迭代器,所以   正确方法为:: for( iter = c.begin(); iter != c.end(); ) iter = c.erase(iter); 关联性容器::(map和set比较常用) erase迭代器只是被删元素的迭代器失效,但是返回值为void, 所