Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10434
  • 博文数量: 10
  • 博客积分: 360
  • 博客等级: 一等列兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-04 11:04
文章分类
文章存档

2011年(1)

2010年(3)

2009年(6)

我的朋友
最近访客

分类: C/C++

2010-05-10 11:16:00

很普通的算法,在一个循环中检查每个元素,判断条件,如果为真,就删除这个节点,再继续循环.看似简单,但是却一个不大不小的陷阱,这种小问题的结论,总是记不住,每次遇到的时候,都得写一个测试程序来验证,干脆总结一下,做个结论
最简单的方法

std::remove_if(_First, _Last, Predicate)

STL是用模板实现,简单高效,但是很多情况下,需要在循环中处理其他逻辑,不能直接使用这个函数

用erase删除
erase有两种原型,删除一个节点和区段删除,对于vector和list,这个操作的定义都是相同的

template< class _TYPE, class _A> iterator  vector::erase(iterator Iterator );
  1. 查 看STL的源代码,这个函数返回的iterator,是指向下一个有效的节点,(如果没有,就指向end)
  2. 注意这个定义,在for循环中不能再调用 it++,不然这样就等同于”it+=2″.如果要想在循环中正确的遍历下去,必须要处理erase的返回值,因为调用 list::erase(iterator it)之后,it指向一个被销毁的值,再调用it++,就会内存异常
  3. vector尽管没有这样的问题,但是在边界也会出现错误。
  4. 正确的处理很简单
iterator _Last = end(); 
for (iterator _First = begin(); _First != _Last; )
{  
       if (*_First == _Val)  
                   _First = erase(_First);  
        else   
               ++_First; 
}
阅读(596) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~