vector迭代器erease操作问题

来源:互联网 发布:苏宁售后知乎 编辑:程序博客网 时间:2024/06/15 18:58

最近在写一个作业题,其中用到了vector的erase操作,不常用,不记得具体怎么回事了,偷个懒,网上搜了一下,直接照抄了,代码如下

[cpp] view plaincopy
  1. vector<mission>::iterator itr = vm.begin();  
  2. while (itr != vm.end())  
  3. {  
  4.     if ((*itr).getStartTime() <= nowTime)  
  5.     {  
  6.         vm.erase(itr);  
  7.     }  
  8.     itr++;  
  9. }  
 

但奇怪的是,运行的时候,每次到这段代码里面,都会直接弹出错误框,看样子是迭代器失效了,指到了不该指的地方

反复看代码,觉得vector为空的时候不可能调用,也不可能指向超过末尾的地方,郁闷半天。。。。只好广泛查阅。。。。

终于。。。找到了原因所在,哎,偷懒的代价啊偷懒的代价啊。。。。

错在不了解erase,网上那哥们儿估计也不了解。。。给出的代码还被人评为最佳答案。。。误人不浅

 

正确写法应该如下

 

[cpp] view plaincopy
  1. vector<mission>::iterator itr = vm.begin();  
  2. while (itr != vm.end())  
  3. {  
  4.     if ((*itr).getStartTime() <= nowTime)  
  5.     {  
  6.         itr = vm.erase(itr);  
  7.     }  
  8.     else  
  9.     {  
  10.         itr++;  
  11.     }  
  12. }  
 

 

原因是因为在erase操作后,原迭代器是相当于一个野指针的状态,对其++必定出错。

 

erase的返回值就是指向被删除的元素的下一个元素的迭代器,嚯嚯

 

还有分析称,其实非野,也会出BUG,vector在erase之后,长度会自动缩减,再++的话,会跳过一个元素,BUG,呵呵


转自: http://blog.csdn.net/mqstreetball/article/details/6003935

原创粉丝点击