关于vector的疑问

cl_mark1 2009-11-23 04:09:33
下面有两段代码:代码1可以正常运行,但是代码2就会报错,为什么(代码1和代码2的区别在于红色标出的那行。vector里面删除元素不就是将后面的元素往前挤么?为什么非要在erase之后重新对iterator赋值呢?而且我在调试的时候发现赋值与不赋值的情形下it都是指向了3,求解!!)

代码1

vector<int> v;

v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(6);

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

代码2
代码1

vector<int> v;

v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(6);

vector<int>::iterator it;
for (it=v.begin(); it!=v.end(); )
{
if (*it == 2)
v.erase(it);
else
++it;
}
}
...全文
194 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
dannylee322 2009-11-24
  • 打赏
  • 举报
回复
迭代器。。。观望ing
xie6723632 2009-11-24
  • 打赏
  • 举报
回复
DEV检查不处来。。。。
小小攻城师 2009-11-23
  • 打赏
  • 举报
回复
迭代器失效 这个是个很普遍的问题
以后楼主要注意凡是能让迭代器失效的 特别是删除之类的操作
一定注意
你第一个代码it接受返回值是it下一个位置
所以没有任何问题
当然第二段代码会出问题 迭代器失效
蜗牛工作室 2009-11-23
  • 打赏
  • 举报
回复
跌代器失效了,一般的编译器都对C++标准库支持不够好,所以有的不报错!
jq2901 2009-11-23
  • 打赏
  • 举报
回复
迭代器失效
cl_mark1 2009-11-23
  • 打赏
  • 举报
回复
我用的是vs2005。报的错误是vector iterators incompatible。

帮助文档上erase的函数的原型是
iterator erase(
iterator _Where
);
iterator erase(
iterator _First,
iterator _Last
);
我看不出来调用erase会对形参it造成什么影响。vector其实就是个数组,在这道题里面vector里面的迭代器不就是一个指针(int*)么?我想不通为什么代码2会错。
bfhtian 2009-11-23
  • 打赏
  • 举报
回复
1L和10L都说了,erase会删除当前迭代器,并返回下一个迭代器,删除后无法自加。把返回值赋给it,使其指向下一个位置
yshuise 2009-11-23
  • 打赏
  • 举报
回复
erase返回当前迭代器的下一个迭代器。
jkx01whg 2009-11-23
  • 打赏
  • 举报
回复
v.erase(it); //删除it,迭代器失效。对于这个失效的迭代器是无法++ , --的
-------改为如下----------
for (it=v.begin(); it!=v.end(); )
{
if (*it == 2)
it=v.erase(it); //删除it,迭代器失效。对于这个失效的迭代器是无法++ , --的
else
++it;
}
}
这样试试?
adamwyb 2009-11-23
  • 打赏
  • 举报
回复
代码2不会报错啊,你把报错信息发来看下
yshuise 2009-11-23
  • 打赏
  • 举报
回复
for (it=v.begin(); it!=v.end(); ) 
{
if (*it == 2)
v.erase(it); //删除it,迭代器失效。对于这个失效的迭代器是无法++ , --的
else
++it;
}
}
hzhxxx 2009-11-23
  • 打赏
  • 举报
回复
我在 gcc --version
gcc (GCC) 4.1.2 20070115 (prerelease) (SUSE Linux) 下编译运行,没有发现错误,看了帮助,似乎没有错误,是不是你的编译器太老,有问题。
pur_e 2009-11-23
  • 打赏
  • 举报
回复
狂汗,测试没错误,刚才我的逻辑错了

for (it=v.begin(); it!=v.end(); )
{
if (*it == 2)
{
v.erase(it);

}
cout<<*it;
it++;
}
}


打印13456
pur_e 2009-11-23
  • 打赏
  • 举报
回复
额,不好意思,打印有错误
hzhxxx 2009-11-23
  • 打赏
  • 举报
回复

erase 里面有解释啊,返回值
pur_e 2009-11-23
  • 打赏
  • 举报
回复
不清楚,我用vc运行没错误

等待高手解答
baihacker 2009-11-23
  • 打赏
  • 举报
回复
c.erase(pos) Removes the element at iterator position pos and returns the position of the next element
如果只是v.erase(it).
在此之后,it就失效了撒.

65,209

社区成员

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

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