关于Vector迭代器失效问题,我注意了,为什么还是不行啊!

紫色动力 2010-01-07 04:07:23

#include<iostream>
#include<vector>
#include<list>
#include<algorithm>

using namespace std;

int main(void)
{
int ia[] = {0, 1,1,2,3,5,8,13,21,55,89};

vector<int> ivec(ia, ia + (sizeof(ia)/sizeof(*ia)));
list<int> ilst(ia, ia + (sizeof(ia)/sizeof(*ia)));

/*
for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
{
if(!(*iter % 2))
{
iter = ivec.erase(iter);
--iter;
}
}
*/

for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
cout<<*iter<<" ";

cout<<endl;

return 0;
}

注释掉的部分总是出错。我的意思是把ivec中的偶数元素删除。
ivec.erase(iter)删除迭代器iter指向的元素,并返回被删除元素的下一个元素。所以我又把iter向前移了一个位置,为什么还是出错啊!
...全文
178 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
kiwigiving 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 purplepower 的回复:]
引用 14 楼 kiwigiving 的回复:
C/C++ code// 你的程序逻辑上没有错误,但是你忽略了ivec中的第一个元素是0,那么会执行// if部分,执行完后iter将指向ivec的第一个元素,那么--iter将出错。// 若将int ia[] 数组的第一个元素0去掉就不会出错了。for(vector <int>::iterator iter= ivec.begin(); iter!= ivec.end();++iter)
    ?-

这个方法虽然行,但把问题改了。
[/Quote]

哦……我不是说想要那样改,我只是想说明一下楼主出现这个问题的原因所在。
修改方法,楼上好多牛人已经给了~
jdjking 2010-01-07
  • 打赏
  • 举报
回复
你的第一个元素是0,0%2=0,!0就是true进入if下面删掉0指向原来的ia[1];由于你删掉了ia[0]所以你原来的ia[1]就变成ia[0]了,你在iter--;越界了。
直接用traceless(老铅)的代码吧
紫色动力 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 kiwigiving 的回复:]
C/C++ code// 你的程序逻辑上没有错误,但是你忽略了ivec中的第一个元素是0,那么会执行// if部分,执行完后iter将指向ivec的第一个元素,那么--iter将出错。// 若将int ia[] 数组的第一个元素0去掉就不会出错了。for(vector<int>::iterator iter= ivec.begin(); iter!= ivec.end();++iter)
?-
[/Quote]
这个方法虽然行,但把问题改了。
mstlq 2010-01-07
  • 打赏
  • 举报
回复
为什么说4楼代码有风险呢?楼主可以参考下文4.1
http://blog.csdn.net/liangjingbo/archive/2008/03/26/2219581.aspx
kiwigiving 2010-01-07
  • 打赏
  • 举报
回复
 // 你的程序逻辑上没有错误,但是你忽略了ivec中的第一个元素是0,那么会执行
// if部分,执行完后iter将指向ivec的第一个元素,那么--iter将出错。
// 若将int ia[] 数组的第一个元素0去掉就不会出错了。
for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end();++iter)
{
if(!(*iter % 2))
{
iter = ivec.erase(iter);
--iter;
}
}
紫色动力 2010-01-07
  • 打赏
  • 举报
回复
用9楼和10楼的方法就对了,呵呵!!!
traceless 2010-01-07
  • 打赏
  • 举报
回复
嘿嘿 其实我只用过STL两次。。。
mstlq 2010-01-07
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20091220/00/BCE7DDC1-0C8D-47F4-8330-84A8C11BD1C5.html
晨星 2010-01-07
  • 打赏
  • 举报
回复
你还不如这样写:
#include<iostream>
#include<vector>
#include<list>
#include<algorithm>

using namespace std;

int main(void)
{
int ia[] = {0, 1,1,2,3,5,8,13,21,55,89};

vector<int> ivec(ia, ia + (sizeof(ia)/sizeof(*ia)));
list<int> ilst(ia, ia + (sizeof(ia)/sizeof(*ia)));

for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end();)
{
if(!(*iter % 2))
iter = ivec.erase(iter);
else
++iter;
}
return 0;
}
mstlq 2010-01-07
  • 打赏
  • 举报
回复
唉……
1楼在误导
4楼的方法有风险……
正确方法一……

for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); )
{
if(!(*iter % 2))
{
iter=ivec.erase(iter);
}
else
{
++iter ;
}
}

正确(推荐)方法二:earse和remove连用……

如果楼主想知道问题在哪里,可以用下面的代码玩玩……
for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
{
if(!(*iter % 2))
{
iter = ivec.erase(iter);
if(iter==ivec.begin())
{
cout<<“iter此时等于ivec.begin(),iter--是会挂的……<<endl;
}
--iter;
}
}
紫色动力 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 traceless 的回复:]
C/C++ codefor(vector<int>::iterator iter= ivec.begin(); iter!= ivec.end(); )
{if(!(*iter%2))
{
ivec.erase(iter++);
}else
{++iter ;
}
}
这样来吧
[/Quote]
用你的代码还是出错。
如果把if里的--iter去掉就正常了,而且结果也正确。
晨星 2010-01-07
  • 打赏
  • 举报
回复
按照你的程序逻辑,第一个元素0就会被删掉,之后iter指向新的“第一个”元素,而指向第一个元素的迭代器是不能--的。
pengzhixi 2010-01-07
  • 打赏
  • 举报
回复
for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)//你的for循环里面又加上去了
traceless 2010-01-07
  • 打赏
  • 举报
回复
ivec.erase(iter++);
traceless 2010-01-07
  • 打赏
  • 举报
回复
for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); )
{
if(!(*iter % 2))
{
ivec.erase(iter ++);
}
else
{
++iter ;
}
}

这样来吧
紫色动力 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
++iter因为你这个又加上去了。
[/Quote]
能说清楚点吗?正是因为要++所以我才在if里用--啊。
wangchentangjuan 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
++iter因为你这个又加上去了。
[/Quote]
LS正解
pengzhixi 2010-01-07
  • 打赏
  • 举报
回复
++iter因为你这个又加上去了。

64,651

社区成员

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

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