`

linxu(C)的链表风格封装 VS STL中的迭代器

阅读更多

起因是因为今天组里有个同事在设计链表erase接口的时候出了点问题。不敢说哪种好哪中坏,先贴代码比较下:遍历删除。


linux下的

list_for_each_safe(p, listhead...)  //p是迭代节点,listhead表示要遍历的节点头
{
    if( ..... )
    {
         list_delete(p);
    }
   
}
 

stl下的

      std::list< int> List;
      std::list< int>::iterator itList;
      for( itList = List.begin(); itList != List.end(); )
      {
            if( WillDelete( *itList) )
            {
               itList = List.erase( itList);
            }
            else
               itList++;
      }
 

今天同事在设计erase接口的时候,由于考虑到了遍历删除,所以返回下一个节点出了点问题。通过比较两者代码会发现,STL对erase进行了封装,用户在使用的时候,必须遵循erase的规则来叠加。而linux的代码封装的是for()这个过程,用户下一回仍然可以使用p,而不用做什么其他的操作,就跟普通的遍历一样,不会因为有删除动作而改变循环的流程。当然,它的技巧很聪明,

#define list_for_each_safe(pos, n, head) \
	for (pos = (head)->next, n = pos->next; pos != (head); \
		pos = n, n = pos->next)

 

从这点上来说,我更喜欢linux。所谓简单的代码以点都不简单,并不是因为设计简单了代码就简单,反而是很聪明。

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics