这个程序编译倒是能通过 可运行时会显示错误 ,怎么整?

请大家来看一下这个erase函数到底怎么用 这个程序编译倒是能通过 可运行时会显示错误 “嘭”一声弹出个对话框Debug Assertion Failed!我觉得肯定是erase函数用法不对 可是找不到错误在哪儿 请大家指导一下了~~~ 对了程序功能是删除vector对象中的偶数和list对象中的奇数 #include<iostream> #include<vector> #include<list> using namespace std; int main() { int ia[10]={2,3,4,5,6,7,8,9,10,11}; vector<int> ivec(ia,ia+10); //定义一个vector对象ivec vector<int>::iterator iter=ivec.begin(); list<int> lvec(ia,ia+10); //定义一个list对象lvec list<int>::iterator lter=lvec.begin(); while(iter!=ivec.end() && lter!=lvec.end()) { if(*iter%2==0) ivec.erase(iter); if(*lter%2!=0) lvec.erase(lter); ++iter; ++lter; } for(iter=ivec.begin(); iter!=ivec.end(); ++iter) cout<<*iter<<" "; cout<<endl; for(lter=lvec.begin(); lter!=lvec.end(); ++lter) cout<<*lter<<" "; cout<<endl; system("PAUSE"); return 0; }

幕布斯7119047
浏览 118回答 1
1回答

慕容3067478

对于vector一般不要用erase(),因为很多情况下他要和<algorithm>中的remove()一块用!erase()的使用会使迭代器失效如果删除的不是最后面的元素的话。你的程序中if(*iter%2==0)ivec.erase(iter);可以换成:(记着加头文件<algorithm>)if(*iter%2==0)ivec.erase(remove(ivec.begin(),ivec.end(),*iter),ivec.end())但如果你用if(*iter%2!=0)ivec.erase(remove(ivec.begin(),ivec.end(),*iter),ivec.end())输出结果则包含11,结果错误!不知道你为什么数组,向量,链表都用,为了和你一致,我也只能改成这样:#include<iostream>#include<vector>#include<list>#include<algorithm>#include<functional>#include<iterator>usingnamespacestd;intmain(){vector<int>ivec;list<int>ilis;intvec[]={2,3,4,5,6,7,8,9,10,11};remove_copy_if(vec,vec+10,back_inserter(ivec),bind2nd(modulus<int>(),2));remove_copy_if(vec,vec+10,back_inserter(ilis),not1(bind2nd(modulus<int>(),2)));for(vector<int>::const_iteratoriter=ivec.begin();iter!=ivec.end();++iter)cout<<*iter<<'\t';cout<<endl;for(list<int>::const_iteratorliter=ilis.begin();liter!=ilis.end();++liter)cout<<*liter<<'\t';cout<<endl;}最好的做法是:#include<iostream>#include<vector>#include<list>#include<algorithm>#include<functional>#include<iterator>usingnamespacestd;intmain(){vector<int>ivec,odd_vec,even_vec;for(inti=2;i!=12;++i)ivec.push_back(i);remove_copy_if(ivec.begin(),ivec.end(),back_inserter(even_vec),bind2nd(modulus<int>(),2));remove_copy_if(ivec.begin(),ivec.end(),back_inserter(odd_vec),not1(bind2nd(modulus<int>(),2)));copy(even_vec.begin(),even_vec.end(),ostream_iterator<int>(cout,"\t"));cout<<endl;copy(odd_vec.begin(),odd_vec.end(),ostream_iterator<int>(cout,"\t"));cout<<endl;}
打开App,查看更多内容
随时随地看视频慕课网APP