码迷,mamicode.com
首页 > 其他好文 > 详细

vector迭代器失效的一种情形

时间:2015-07-22 18:24:32      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:

使用过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 }

 

运行结果:

技术分享

 

vector迭代器失效的一种情形

标签:

原文地址:http://www.cnblogs.com/vpoet/p/4667871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!