list的一个问题,请教!!

yanyanem 2003-02-13 05:04:51
删除list<int>ilist中的所有奇数元素,程序如下:

int ia[]={0,1,2,3,4,5,6,7,8,9};
list<int >ilist(ia,ia+10);
list<int>::iterator it=ilist.begin();
while(it!=ilist.end())
{
if ((*it)%2!=0)
ilist.erase(it);
it++;
}
为什么每次执行if ((*it)%2!=0)语句时总发生内存错误?
...全文
17 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangrk 2003-02-14
  • 打赏
  • 举报
回复
int ia[]={0,1,2,3,4,5,6,7,8,9};
list<int >ilist(ia,ia+10);
list<int>::iterator it=ilist.begin();
while(it!=ilist.end())
{
if ((*it)%2!=0)
ilist.erase(it++);
else ++it;
}

这个问题在Herb Sutter的More Exceptional C++的条款9有。
allen1981813 2003-02-13
  • 打赏
  • 举报
回复
void main(){
int ia[]={0,1,2,3,4,5,6,7,8,9};
list<int> ilist(ia,ia+9);
for(list<int>::iterator it=ilist.begin(); it!=ilist.end();){
if ((*it)%2)
it=ilist.erase(it);
else
it++;
}
}
  • 打赏
  • 举报
回复
还是chianjiji说的对,
我也是这个意思,只是不知道如何处理这个iterator(对STL不熟),因此支的歪招,见笑:)
你可以结帐了!
chinajiji 2003-02-13
  • 打赏
  • 举报
回复
//关键是你没有处理好边删除,边遍历的关系,致使list混乱;这个错误很容易出现的.
//改正如下:
#include <iostream>
#include <stdlib.h>
#include <list>
using namespace std;

int main(int argc, char *argv[])
{
int ia[]={0,1,2,3,4,5,6,7,8,9};
list<int>ilist(ia,ia+10);
list<int>::iterator it=ilist.begin();
int i = 0;

while(it != ilist.end())
{
if ((*it)%2!=0) {
cout << *it << endl;
it = ilist.erase(it);//这一句是关键,ilist.erase(it)
//删除it指向的元素,并返回指向下一个元素的it;
}
else
it++;
}
system("PAUSE");
return 0;
}
hellwolf 2003-02-13
  • 打赏
  • 举报
回复
刚刚写错了:
#include <list>
#include <iterator>
#include <algorithm>
#include <iostream>

using namespace std;

int main(){
int ia[]={0,1,2,3,4,5,6,7,8,9};
list<int>ilist(ia,ia+10);
list<int>::iterator it=ilist.begin();
list<int>::iterator tmp = it;
while(it!=ilist.end())
{
tmp++;
if ((*it)%2!=0)
ilist.erase(it);
it = tmp;
}
copy(ilist.begin(),ilist.end(),ostream_iterator<int>(cout," "));
system("pause");
}
hellwolf 2003-02-13
  • 打赏
  • 举报
回复
你把it删掉了,it就失效了
it++没有定义的错误

tmp=it
ilist.erase(tmp);
it++
yanyanem 2003-02-13
  • 打赏
  • 举报
回复
to 小笨
还是一样出错!
  • 打赏
  • 举报
回复
int ia[]={0,1,2,3,4,5,6,7,8,9};
list<int >ilist(ia,ia+10);
list<int>::iterator it=ilist.begin();
while(it!=ilist.end())
{
list<int>::iterator itptr=0;
itptr=it;
if ((*itptr)%2!=0)
ilist.erase(itptr);
it++;
}

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧