vector通过迭代器删除一个元素后,迭代器加一时出错。请问这是为什么呢?

ysp1986 2008-09-25 10:40:42
出错代码如下:
for(vector<CPl>::iterator it= m_aPl.begin();it<m_aPl.end();++it)
{
//若航班在10个时间片之前降落,加入它到已经降落的航班队列中后消灭它
if(nCT - (*it).m_T>10)
{
m_aPlp.push_back(*it);
m_aPl.erase(it);
}
}

这里运行到红色部分再之后就会有vector中的一个中断出现,请问这是为什么呢?
...全文
300 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
taojian_hhu 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 erwin1984 的回复:]
m_aPl.erase(it--); 不可取,因为 it == m_aPl.begin() 时就会有问题。
it -- 后 it 仍然指向的是 m_aPl.begin();
[/Quote]

for循环中又 ++it 了
erwin1984 2008-09-25
  • 打赏
  • 举报
回复
m_aPl.erase(it--); 不可取,因为 it == m_aPl.begin() 时就会有问题。
it -- 后 it 仍然指向的是 m_aPl.begin();
erwin1984 2008-09-25
  • 打赏
  • 举报
回复
for(vector <CPl>::iterator it= m_aPl.begin();it <m_aPl.end();) 
{
//若航班在10个时间片之前降落,加入它到已经降落的航班队列中后消灭它
if(nCT - (*it).m_T>10)
{
m_aPlp.push_back(*it);
m_aPl.erase(it++);
//it = m_aPl.erase(it); //这样也行。
}
else
{
it ++;
}
}


循环中删除元素得考虑删除后it的自增问题。
taojian_hhu 2008-09-25
  • 打赏
  • 举报
回复
erase操作会使it失效
try

m_aPl.erase(it--);

lizhaochai 2008-09-25
  • 打赏
  • 举报
回复
erase()后iterator失效,并返回所删除的元素的下一个位置
ViCross 2008-09-25
  • 打赏
  • 举报
回复
请翻阅<effective STL>, CSDN上这样的帖子很多了.
cxyOOOO 2008-09-25
  • 打赏
  • 举报
回复
it = m_aPl.erase(it);
erwin1984 2008-09-25
  • 打赏
  • 举报
回复
如果是第一个元素,it -- 后 it 仍然指向的是 m_aPl.begin();
此时,erase 后,it 指向已经有问题了,for循环中 ++it 也会有问题了吧。

it -- 后 在for循环中 ++it 对于删除不是一个元素倒是没问题。
ysp1986 2008-09-25
  • 打赏
  • 举报
回复
你的意思我了解~,但是如果我删的是begin()这个it--就不知该指向哪了
[Quote=引用 6 楼 taojian_hhu 的回复:]
引用 5 楼 erwin1984 的回复:
m_aPl.erase(it--); 不可取,因为 it == m_aPl.begin() 时就会有问题。
it -- 后 it 仍然指向的是 m_aPl.begin();


for循环中又 ++it 了
[/Quote]
ysp1986 2008-09-25
  • 打赏
  • 举报
回复
我试着改成这样过 ,还是会触发断点,跳出程序
for(vector<CP>::iterator it= m_aP.begin();it<m_aP.end();)
{
if(nC - (*it).m_it>10)
{
m_aLP.push_back(*it);
vector<CP>::iterator ittemp = it;
++ittemp;
m_aP.erase(it);
continue;
}
++it;
}
ysp1986 2008-09-25
  • 打赏
  • 举报
回复
vector<int> vcta;
for(int i=0;i<100;++i)
{
vcta.push_back(i);
}
for(vector<int>::iterator it = vcta.begin();it<vcta.end();++it)
{
if(*it==24)
vcta.erase(it);
}

这是另一段测试的代码,为什么这里不会跳出中断呢?顶楼的帖子是在vc2005编译的 这个是vc6编译的,

65,210

社区成员

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

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