【求助】使用vector.erase()删除一个元素时遇到的一个问题

明何 2012-04-01 09:40:48
写了一个小代码玩,想要删除vector中的奇数值。

int main()

{
int ia[]={0,1,3,2,3,5,8,13,21,55,89};
vector<int> vec (ia,ia+11);
vector<int> ::iterator iter, first;
/ector<int>::iterator temp;

/*first = find(vec.begin(),vec.end(),5);
last = find(vec.begin(),vec.end(),13)
vec.erase(first,last);*/

first=vec.begin();

//写法1、这样会出错
while(first != vec.end())
{
if ((*first) % 2 != 0)
{
vec.erase(first); //这样写就会出现错误
continue;
}
first=first+1;

}


/*写法2、这样不会出错
while(first != vec.end())
{
if ( (*first)%2 != 0)
{
first = vec.erase(first); //换成这种写法就不会发生错误
continue;
}
first++;
}

*/

for (iter = vec.begin(); iter != vec.end(); iter++)
{
cout << *iter << endl;
}

}


出错的情况是这样的,当我删掉第一个奇数值1之后,我看到first指向的值变成了3,continue语句跳转到while语句后再判断就报错了。

然后。。。。。。
我查了STL源码剖析,里面erase操作的源码是

iterator erase(iterator position)
{
if (position + 1 != end())
copy(position + 1, finish, position);
--finish;
destory(finish);
return position;
}


这里我就感觉很奇怪了,源码中返回的position就是一个指向原先vector下一个值的地址,为什么写法1中就存在错误,而写法2就没有错误。而且调试的时候,我也看到first指向了下一个值。为什么就出现错误了。。。

个人感觉应该不是指向地址的问题。可能是iterator内部实现机制的问题。。但是没查到相关资料

求指导。。。。。。

第一次发帖,不知道这样说明够不够准确
...全文
177 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
明何 2012-04-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

google "迭代器失效"
[/Quote]

OK,明白了。。。。
Jim_King_2000 2012-04-01
  • 打赏
  • 举报
回复
google "迭代器失效"

64,645

社区成员

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

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