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