list和vector

u010643024 2013-05-28 09:00:49
请高手看看下面代码是哪里出了错?
#include<iostream>
#include<vector>
#include<list>
using namespace std;

int main()
{
int ia[]={0,1,1,2,3,5,8,13,21,55,89};
list<int> lis(ia,ia+11);

for(list<int>::iterator iter=lis.begin();iter!=lis.end();++iter)
if(*iter%2!=0)
{lis.erase(iter);
--iter;}
else
cout<<*iter<<" ";
cout<<endl;
system("pause");
return 0;
}
...全文
110 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
幸福的耗子 2013-05-29
  • 打赏
  • 举报
回复
lis.erase(iter);// 这时迭代器已失效,不要再继续使用了。 想实现你要的结果,应该可以这样:
#include<iostream>
#include<vector>
#include<list>
using namespace std;

int main()
{
	int ia[]={0,1,1,2,3,5,8,13,21,55,89};
	list<int> lis(ia,ia + 11);
	list<int> newlist;

	for(list<int>::iterator iter=lis.begin();iter!=lis.end();++iter)
	{
		if (*iter % 2 == 0)
		{
			newlist.push_back(*iter);
			cout << *iter << "  ";
		}
	}

	// 到这里newlist就是你想要的结果
	cout << endl;
	system("pause");
	return 0;
}
大尾巴猫 2013-05-29
  • 打赏
  • 举报
回复
引用 13 楼 u010643024 的回复:
这个代码主要是将ia里的奇数全部删除,里面的--iter是防止迭代器失效的,编译时没有错啊,只是运行时出错,不知道是什么问题
lis.erase(iter); 删除iter指向的节点,iter就失效了,你再++和--还希望能得到一个正确的iter? 比如链表中一个节点的指针被设置NULL,你用这个NULL指针指向的节点取next还行么 正确的操作是用一个副本在删除前取得next,保留这个副本继续操作链表,再删除原先的节点。
u010643024 2013-05-29
  • 打赏
  • 举报
回复
引用 7 楼 greex 的回复:
想做什么?遇到什么问题说清楚。
是啊,编译没错,可是运行时出错了,什么原因
u010643024 2013-05-29
  • 打赏
  • 举报
回复
引用 1 楼 zyaiwx 的回复:
测试通过的人飘过。你这不是关联容器,迭代骑也没失效。
是啊,编译没错,可是运行时出错了,什么原因
u010643024 2013-05-29
  • 打赏
  • 举报
回复
这个代码主要是将ia里的奇数全部删除,里面的--iter是防止迭代器失效的,编译时没有错啊,只是运行时出错,不知道是什么问题
有新工作否 2013-05-29
  • 打赏
  • 举报
回复
在遍历容器过程中,最好不要删减或者增加容器元素,list还稍微好一点,因为每次删减或者增加,不改变内存位置,只要小心一点,还可以操作。 但是其他容器,在增加或者删减的时候,很可能会删除原来的内存,重新申请一段新的内存的。这样会导致原先的迭代器找不到新申请容器的地址的。 本题的操作最好把符合结果的值复制到一个新的容器,不要修改原来的容器。 是不是这样说的?还是我想当然以为这样?
  • 打赏
  • 举报
回复
++iter 或 --iter 都是利用自身指针运算返回 建议不要 ++iter 或 --iter,在迭代器运算在清除当前 ++iter 或 --iter,没有后续iter继续后面的运算会访问错误
大尾巴猫 2013-05-29
  • 打赏
  • 举报
回复
删除一个元素后 --iter是什么意思,逻辑上不通啊,删了一个,应该++iter才对 在做删除元素的操作后,迭代器失效。要在删除前保存一个副本。

#include<iostream>
#include<vector>
#include<list>
using namespace std;

int main()
{
    int ia[]={0,1,1,2,3,5,8,13,21,55,89};
        list<int> lis(ia, ia + sizeof(ia) / sizeof(int));
   
	list<int>::iterator iter = lis.begin();
    while (iter != lis.end())
	{
		if(*iter%2!=0)
			lis.erase(iter++); //利用后++产生的副本
		else
			++iter;
	}
    
	//检查结果
	for (iter = lis.begin(); iter != lis.end(); ++iter)
		cout << *iter << " ";
	cout<<endl;  
    system("pause");
	return 0;
}
我看你有戏 2013-05-29
  • 打赏
  • 举报
回复
   iter = lis.erase(iter);//遍历删除的时候用这个,但是好像Linux下有问题
hugett 2013-05-29
  • 打赏
  • 举报
回复

#include<iostream>
#include<vector>
#include<list>
using namespace std;

int main()
{
    int ia[]={0,1,1,2,3,5,8,13,21,55,89};
	list<int> lis(ia,ia+11);
   
    for(list<int>::iterator iter=lis.begin();iter!=lis.end();++iter)
	{
		if(*iter%2!=0)
		{
			 iter = lis.erase(iter);//改成这样。。否则迭代器失效。。
			 --iter;
		}
		else cout<<*iter<<"  ";
	}
    cout<<endl;  
    system("pause");
    return 0;
}
greex 2013-05-28
  • 打赏
  • 举报
回复
想做什么?遇到什么问题说清楚。
  • 打赏
  • 举报
回复
ia+11是什么啊
buyong 2013-05-28
  • 打赏
  • 举报
回复
你直接说什么问题
QQ2472322319 2013-05-28
  • 打赏
  • 举报
回复
不小得是什么问题 我这边表示pass
turing-complete 2013-05-28
  • 打赏
  • 举报
回复
迭代器失效。 References and iterators to the erased elements are invalidated. Other references and iterators are not affected.
ForestDB 2013-05-28
  • 打赏
  • 举报
回复
iter又加又减的干嘛呢?
zybjtu 2013-05-28
  • 打赏
  • 举报
回复
测试通过的人飘过。你这不是关联容器,迭代骑也没失效。

64,637

社区成员

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

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