这是一个古老的话题,今天拿来再炒一下,原因是我又用错了。
查阅各种 comments 以及根据我自己的使用经验,当在 vector 中 查找并 删除 其中多个元素时,我发现主要有两种方法:
// ------ Sample 1:
for ( vector<int>::iterator it = m_vecIDSet.begin(); it != m_vecIDSet.end(); )
{
vector<int>::iterator it_tmep = it;
++it;
int nID_in_set = *it_tmep;
if ( nID_in_set == nID_to_find )
{
m_vecIDSet.erase( it_tmep );
}
}
// ------ Sample 2:
for ( vector<int>::iterator it = m_vecIDSet.begin(); it != m_vecIDSet.end(); )
{
int nID_in_set = *it;
if ( nID_in_set == nID_to_find )
it = m_vecIDSet.erase( it );
else
++it;
}
两种方法看似都很好,但是经过我的实验,我发现:采用前者方法时,如果vector里存储 new出来的对象的指针,在连续查找并删除时,有时会出现 iterator 的失效问题;相同情况下,换用后者方法,工作的很好。稍微想了下原因,可能是由于erase之后,iterator不会自动指到下一个元素。如果用后者方法,直接把erase返回的iterator立即赋值给当前的 it,这样就不会出错了。可是前者方法只是对临时的 iterator it_temp 进行操作的,而且控制了 it 的前进,为何也会出错? 由于时间紧急,此处先mark,等忙完再仔细研究这个问题。
哪位大侠,若是看到了我的疑问,恳请不吝赐教!
后来,经过业内专家人士佳哥的确认后,我就有了答案:
1楼 AlbertLi 2013-03-31 14:21发表 Sample1的时候,是由于使用erase后,自动指向下一个元素,而你当前的迭代器it已经失效了,因此it++后不能正确指向下一个元素了,Sample2是正确用法!-
Re:
DavyHwang 2013-04-01 13:47发表
-
- 回复AlbertLi:哈哈 得到佳哥的确认后,我就放心了 :-D
Davy_H
13-03-12
本文探讨了在C++中如何使用vector的erase方法删除多个元素,提供了两种常见方法,并分享了作者的经验及业内专家的确认。
1246





