C++向量函数erase在for循环下的错误用法

最近在看C++primer这本书,就内容来说确实很经典,对于初学C++的我来说增加了不少知识,不过今天在看有关向量一章节时对于课后习题的答案有所怀疑,在这里就发表一下自己的看法:

相关题目如下:假设有如下ia定义,将ia 复制到一个vector容器和一个list容器中,使用单个迭代器参数版本的erase函数将list容器中的奇数值元素删除,将vector容器中的偶数值删除:

其中 ia[]={0,1,1,2,3,5,8,13,21,55,89};

处于简单考虑,我就将程序的主要部分内容分享下

int ia[]={0,1,1,2,3,5,8,13,21,55,89};
 vector<int>ivec(ia,ia+11);

for(vector<int>::iterator vit=ivec.begin();
  vit!=ivec.end(); ++vit)
 {
  if(*vit % 2==0)
  {
   vit=ivec.erase(vit);
   --vit;
  }   
 }

如果向量中的第一个元素是奇数,那么这个程序并无错误,但当地一个数十偶数的时候错误就产生了,我们知道当调用erase函数删除元素p的时候,迭代器会自动指向下一个元素,这里我们可以假设为m,这时候如果我们再进行--vit,那么迭代器就会指向一个空的元素,进而产生错误;当然这种错误仅仅在于第一个元素不符合条件的时候才会产生,也算代码的一个漏洞吧!在这里我对代码换了一种做法,这样就不需要考虑第一个数据奇偶的问题了,分享下:

vector<int>::iterator iter=ivec.begin();

while(iter!=ivec.end())
  {
   if(*iter%2==0)
   {
    iter=ivec.erase(iter);
   }
   else
   {
    cout<<*iter<<endl;
    ++iter;
   }
   
  }

闲来无事写的,如有不对的地方还望海涵海涵!

原文链接: https://www.cnblogs.com/naudnaud/p/3174171.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++向量函数erase在for循环下的错误用法

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/94682

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月10日 上午2:45
下一篇 2023年2月10日 上午2:45

相关推荐