vector里的erase问题

xiaoxiaofengqi 2008-11-08 03:50:04
最近碰到一个关于vector里的erase方法的问题。

代码如下:for( vector< CComQIPtr<IHTMLElement> >::iterator its = Result.begin(); its != Result.end(); ++its)
for( vector< CComQIPtr<IHTMLElement> >::iterator itp = childVector.begin(); itp != childVector.end(); ++itp)
{
if( (*itp) == (*its) )
{
childVector.erase( itp );
}
}

这里的Result里的元素是childvector里面元素的子集。程序调试运行到最后,总会提示访问越界。
C++ primer里提到vector在删除元素的时候遥确保迭代器指向的元素是有效的。
这个是不是跟最后一个元素的迭代器会指向end(),因而不是有效的元素有关呢?
如是这样的话,有什么解决的方法吗?
...全文
290 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxiaofengqi 2008-11-14
  • 打赏
  • 举报
回复
谢谢啊,结贴.
机智的呆呆 2008-11-08
  • 打赏
  • 举报
回复
vector在插入或删除元素时,有可能会导致迭代器的失效~~~~~~
jia_xiaoxin 2008-11-08
  • 打赏
  • 举报
回复
//删除迭代器元素后,迭代器元素会指向下一个,所以此时不需要++itp
for( vector < CComQIPtr <IHTMLElement> >::iterator its = Result.begin(); its != Result.end(); ++its) 
for( vector < CComQIPtr <IHTMLElement> >::iterator itp = childVector.begin(); itp != childVector.end())
{
if( (*itp) == (*its) )
{
childVector.erase( itp );
}
else
{
++itp;
}
insulted 2008-11-08
  • 打赏
  • 举报
回复
4楼正解;
3楼的code,
加入现在itp指向{a,b,c,d}中的b,
如果删除了元素b,则itp指向c,但是在内循环中itp又++,则itp指向了元素d,也就是说,元素c被漏掉了,即元素c没有参与if( (*itp) == (*its) ) 的比对操作!
lzr001 2008-11-08
  • 打赏
  • 举报
回复
这样试一下:

for( vector < CComQIPtr <IHTMLElement> >::iterator its = Result.begin(); its != Result.end(); ++its)
for( vector < CComQIPtr <IHTMLElement> >::iterator itp = childVector.begin(); itp != childVector.end(); )
{
if( (*itp) == (*its) )
{
itp = childVector.erase( itp );
}
else
{
itp++;
}

}
帅得不敢出门 2008-11-08
  • 打赏
  • 举报
回复
试试这个

for( vector < CComQIPtr <IHTMLElement> >::iterator its = Result.begin(); its != Result.end(); ++its)
for( vector < CComQIPtr <IHTMLElement> >::iterator itp = childVector.begin(); itp != childVector.end(); ++itp)
{
if( (*itp) == (*its) )
{
itp = childVector.erase( itp );
}
}

Lnnu_lc 2008-11-08
  • 打赏
  • 举报
回复
7楼的说的对啊,所以这个是个问题啊
aFlyingEagle 2008-11-08
  • 打赏
  • 举报
回复
楼主最好在仔细看下C++ PRIMER 中这句话, c.erase(p);返回一个迭代器,它指向被删除元素后面的元素,如果P所指向容器内最后一个元素,则返回的迭代器指向容器的超出末端的下一位置,如果P本身就是指向超出末端的下一位置的迭代器,则函数未定义,
阿呆_ 2008-11-08
  • 打赏
  • 举报
回复
for (.....)
for ( itp = childVector.end()-1;;--itp )
{
bool flg = itp == childVector.begin();
...
if (flg) break;
}

64,642

社区成员

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

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