一开始写的代码会报这个错误: vector iterator incompatib,错误代码如下:
int main()
{
int ia[]={0,1,1,2,3,5,8,13,21,55,89};
vector<int> ivec(ia,ia+11);
list<int> ilist(ia,ia+11);
vector<int>::iterator iter_ivec=ivec.begin();
list<int>::iterator iter_ilist=ilist.begin();
while(iter_ivec!=ivec.end())
{
if((*iter_ivec)%2==0){
ivec.erase(iter_ivec);//
}
else
++iter_ivec;
}
while(iter_ilist!=ilist.end())
{
if((*iter_ilist)%2!=0){
ilist.erase(iter_ilist);//
}
else
++iter_ilist;
}
for(vector<int>::iterator iter_ivec=ivec.begin();iter_ivec!=ivec.end();++iter_ivec)
{
cout<<*iter_ivec<<" ";
}
cout<<endl;
for(list<int>::iterator iter_ilist=ilist.begin();iter_ilist !=ilist.end();++iter_ilist)
{
cout<<*iter_ilist<<" ";
}
cout<<endl;
return 0;
}
包含//的代码段有问题,在erase操作后,没有将循环变量iter_ivec指向修改后的向量迭代器,就继续循环,再与end()比较时断言出现。 解决方法是将“iter_ivec=ivec.erase(iter_ivec);”替换为“iter_ivec=ivec.erase(iter_ivec);”,这是因为STL里的所有容器类中的erase实现都会返回一个迭代器,这个迭代器指向了“当前删除元素的后继元素,或是end()”。(此处参考了:(1条消息) 关于list iterators incompatible/vector iterators incompatible 报错总结_Jackery's Special Column -CSDN博客)正确代码如下
int main()
{
int ia[]={0,1,1,2,3,5,8,13,21,55,89};
vector<int> ivec(ia,ia+11);
list<int> ilist(ia,ia+11);
vector<int>::iterator iter_ivec=ivec.begin();
list<int>::iterator iter_ilist=ilist.begin();
while(iter_ivec!=ivec.end())
{
if((*iter_ivec)%2==0){
iter_ivec=ivec.erase(iter_ivec);//ivec.erase(iter_ivec);是会报错 vector iterator incompatible
}
else
++iter_ivec;
}
while(iter_ilist!=ilist.end())
{
if((*iter_ilist)%2!=0){
iter_ilist=ilist.erase(iter_ilist);//
}
else
++iter_ilist;
}
for(vector<int>::iterator iter_ivec=ivec.begin();iter_ivec!=ivec.end();++iter_ivec)
{
cout<<*iter_ivec<<" ";
}
cout<<endl;
for(list<int>::iterator iter_ilist=ilist.begin();iter_ilist !=ilist.end();++iter_ilist)
{
cout<<*iter_ilist<<" ";
}
cout<<endl;
return 0;
}