迭代器失可能会导致野指针,可能会引起漏删或者插入时出错.
list中的迭代器失效
在标准库中,list是带头双向不循环链表.
场景一:删除链表中所有的偶数节点
7 list<int> l;
8 l.push_back(0);
9 l.push_back(1);
10 l.push_back(2);
11 l.push_back(3);
12 l.push_back(4);
13 list<int>::iterator it = l.begin();
14 while(it != l.end())
15 {
16 if(*it % 2 == 0)
17 {
18 l.erase(it);
19 }
20 ++it;
21 }
22 list<int>::iterator i = l.begin();
23 while(i != l.end())
24 {
25 cout<<*i<<" ";
26 ++i;
27 }
28 cout<<endl;
运行时会有段错误.
分析原因:如下图所示:
解决:在删除之前进行++;
13 list<int>::iterator it = l.begin();
14 while(it != l.end())
15 {
16 if(*it % 2 == 0)
17 {
18 list<int>::iterator cur = it;
19 ++it;
20 l.erase(cur);
21 }
22 else
23 {
24 ++it;
25 }
26 }
方法2解决:
27 list<int>::iterator it = l.begin();
28 while(it != l.end())
29 {
30 if(*it % 2 == 0)
31 {
32 it = l.erase(it); //因为标准库的erase返回值是迭代器,而返回的迭代器是被删除元素的下一个迭代器.这样也就不会有野指针的问题了.
33 }
34 else
35 {
36 ++it;
37 }
38 }
vector中的迭代器失效
在vector中,也会导致迭代器失效.
例如:删除可能会造成漏删的情况
比如:下面图片中:删除所有的偶数
解决:与list的方法相似
9 vector<int> v;
10 v.push_back(0);
11 v.push_back(1);
12 v.push_back(2);
13 v.push_back(3);
14 v.push_back(4);
15 vector<int>:: iterator it = v.begin();
16 while(it != v.end())
17 {
18 if(*it % 2 == 0)
19 {
20 it = v.erase(it); //接收函数的返回值
21 }
22 else
23 {
24 ++it;
25 }
26 }
27 vector<int>:: iterator i = v.begin();
28 while(i != v.end())
29 {
30 cout<<*i<<" ";
31 ++i;
32 }
失效场景2:vector进行插入时,会因为扩容而导致传入的值失效.