起因是因为今天组里有个同事在设计链表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。所谓简单的代码以点都不简单,并不是因为设计简单了代码就简单,反而是很聪明。
分享到:
相关推荐
纯C语言实现仿C++STL泛型链表,实现了C++STL链表的基本功能,但代码并未做完善的测试,性能也不能保障,主要用于初学者学习
自己写的,各种链表的封装接口,可以直接使用,非常方便
C语言中关于链表的总结内容,内附代码例题,详细的有条理的讲解链表内容
C语言链表C语言链表C语言链表C语言链表
C++中STL的List链表容器的自行实现,自行实现迭代器、类、封装函数等
(1)内核链表中实现一个纯链表的封装,以及纯链表的各种操作函数 纯链表就是没有数据区域,只有前后向指针; 各种操作函数是节点创建、插入、删除、遍历。 这个纯链表本身自己没有任何用处,它的用法是给我们具体...
linux内核链表源代码,是list.h是链表的实现,有兴趣的朋友可以下载分析。
将linux内核源码中list.h拿出来, 增删与遍历部分写了详细注释, 关于链表合并, 没用过所以没写. 源码版本是2.6.32, 不过链表的源码改动应该不是很大. 我的邮箱2253238252@qq.com, 代码有什么不对的欢迎发邮件给我
用命令行的C++链表封装了的,实现功能完善,健壮性良好
linux内核链表的实现,包括内核链表的定义,以及内核链表相关的操作
大一初学C语言时的期末作业,涉及到链表的建立和功能的实现,涉及指针、函数、动态结构建立等方面的知识,初学者可以参考参考尝试尝试哟!!!
C语言链表C语言链表C语言链表C语言链表C语言链表
贪吃蛇小游戏,用c语言和Linux内核链表实现,图行显示基于curses库,游戏界面有时钟计时器和当前分数、上一次游戏分数、历史最高分数显示。
C语言链表类题目 写函数建立一个有三名学生数据的单项动态链表,很全面,各种测试都试过了,环境VC6.0
详细的介绍了Linux内核中使用的最频繁的双向链表
C语言链表的应用,包括建立链表、删除链表、插入/删除元素操作
小型通讯录程序c语言链表实现(源代码) CentOS下vim编辑器gcc编译器
Linux内核链表移植和测试代码
吐血奉献,忍痛共享! 【最强悍的链表】Linux 内核链表源码
对linux内核的链表结构和对内核链表的操作进行超详细讲解