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

本文对比了Linux和STL中链表遍历删除的实现方式。Linux采用list_for_each_safe进行安全遍历,即便删除节点也不影响后续迭代;而STL通过返回下一个元素迭代器的方式确保遍历正确。两种方法各有千秋。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

起因是因为今天组里有个同事在设计链表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。所谓简单的代码以点都不简单,并不是因为设计简单了代码就简单,反而是很聪明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值