C++ vector 之 erase 多个元素的两种常用方法

来源:互联网 发布:湖南软件检测 编辑:程序博客网 时间:2024/05/22 05:08

这是一个古老的话题,今天拿来再炒一下,原因是我又用错了。

查阅各种 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

原创粉丝点击