最近在看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;
}
}
闲来无事写的,如有不对的地方还望海涵海涵!