用list为什么不行啊

leijinjin 2007-05-05 01:40:07
#include<iostream>
#include<list>
using namespace std;
void main()
{
int ia[]={0,1,1,2,2,3,5,8,13,21,55,89};
list<int> ilist;
for(list<int>::size_type j=0;j!=12;j++)
ilist.push_back(ia[j]);
list<int>::iterator iter=ilist.begin();
for(;iter!=ilist.end();++iter)
if(*iter%2)
{
ilist.erase(iter);
--iter;
}
for(iter=ilist.begin();iter!=ilist.end();++iter)
cout<<*iter<<" ";
cout<<endl;
}
将list中的奇数值删掉,有问题,但是用vector就可以了,要是用list怎么改才行啊,谢谢了

...全文
196 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cangwu_lee 2007-05-05
  • 打赏
  • 举报
回复
可以这样理解吧

List 应该是单向的,取一个、向前走一个。
vector 是双向的,取一个,停住。
leijinjin 2007-05-05
  • 打赏
  • 举报
回复
谢谢各位了.
但是用vector的确可以
takecareofmyself 2007-05-05
  • 打赏
  • 举报
回复
iterator从最后一个元素开始遍历,找到符合要求的删除,这样就没有问题了。
原因是:如果从开头迭代,一旦找到符合要求的元素,再把这个元素(假设为a)删除,那iterator此时指向的这个被删除元素的下一个元素(假设为b),再++,下次进循环就指向了b的下一个元素,这样,b是否符合要求根本没有验证。
从尾部迭代,找到符合要求的元素(假设为x),把x删除,iterator此时指向x的后一个元素y,再--,在下次循环时,就指向了现在y的前一个元素,也就是刚才x的前一个元素,所以,这样就对所有元素遍历了一遍。
alwaysLonely 2007-05-05
  • 打赏
  • 举报
回复
iterator的用法有问题。

erase()函数调用后,想象一下,现在你的iterator指向哪里?那你还能不能再做递增或者递减操作?

还有,我咋记得标准里是Remove()函数呢?理解一下自己编译器的实现就行了。这个错误如果在Windows中Debug应该可以看到操作系统的异常消息的。其他系统应该也有,没在别的系统上犯过这错误,不清楚。
bierhoffwang 2007-05-05
  • 打赏
  • 举报
回复
for(;iter!=ilist.end();++iter)
if(*iter%2)
{
ilist.erase(iter);
--iter;
}
改成
while (iter != ilist.end())
if(*iter%2)
{
iter = ilist.erase(iter);
}
else
{
iter++;
}
另外用vector好像也不行吧,至少我是这样。

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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