C++之迭代器失效及解决

迭代器失可能会导致野指针,可能会引起漏删或者插入时出错.

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进行插入时,会因为扩容而导致传入的值失效.
这里写图片描述

猜你喜欢

转载自blog.csdn.net/yinghuhu333333/article/details/80744440