首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求教高手!一个关于erase调用越界的有关问题

2012-03-25 
求教高手!一个关于erase调用越界的问题原题是CPP第四版习题9.26的练习书上的答案是C/C++ codeint main(){i

求教高手!一个关于erase调用越界的问题
原题是CPP第四版习题9.26的练习书上的答案是

C/C++ code
int main(){int ia[]={0,1,1,2,3,5,8,13,21,34,55,89}; vector<int> ivec(ia,ia+11); list<int> ilst(ia,ia+11); for (vector<int>::iterator vit = ivec.begin();vit != ivec.end();++vit) {if ( *vit % 2==0){     vit=ivec.erase(vit);     --vit;     } } for (list<int>::iterator lit = ilst.begin();lit != ilst.end();++lit) {if ( *lit % 2!=0){     lit=ilst.erase(lit);     --lit; } }


编译通过但是debug时报错,说是“debug assertion failed”,我觉得可能是越界了导致内存出问题的。
我修改了一下:

C/C++ code
int main(){int ia[]={0,1,1,2,3,5,8,13,21,34,55,89}; vector<int> ivec(ia,ia+11); list<int> ilst(ia,ia+11); for (vector<int>::iterator vit = ivec.begin();vit != ivec.end();++vit) {if ( *vit % 2==0){     vit=ivec.erase(vit);          } } for (list<int>::iterator lit = ilst.begin();lit != ilst.end();++lit) {if ( *lit % 2!=0){     lit=--ilst.erase(lit);      } }


Debug虽然成功了,但是结果不对了。输出的ilst是没错,可是ivec输出缺少了89这个数字。原因我也略懂一些,明显是erase调用到55的时候直接跳过89到ivec.end上去了。

不过这到底是为什么呢?怎么修改原来的程序能使89不会被跳过呢?求教高手!

PS:我用的 VS2008 pro。

[解决办法]
C/C++ code
#include <iostream>#include <vector>#include <list>using namespace std;int main(){    int ia[]=    {        0,1,1,2,3,5,8,13,21,34,55,89,    };    vector<int> ivec(ia,ia+12);    list<int> ilst(ia,ia+12);    vector<int>::iterator vit = ivec.begin();    while(vit!=ivec.end())    {        if ( (*vit)%2==0 )        {            vit=ivec.erase(vit);        }        else        {            cout<<*vit<<" ";            vit++;        }    }    cout<<endl;    list<int>::iterator lit = ilst.begin();    while(lit!=ilst.end())    {        if ( (*lit)%2!=0 )        {            lit=ilst.erase(lit);        }        else        {            cout<<*lit<<" ";            lit++;        }    }    cout<<endl;} 

热点排行