STL中List的实现分析

本文解析了C++ STL库中list容器的具体实现方式,详细介绍了双向链表节点的结构和List类的设计,并探讨了桥接模式在此设计中的应用。

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

之前自己动手写了一个单向链表的简易实现,就好奇STL中list是如何实现的,在库文件/usr/include/c++/4.7.2/bits/stl_list.h中看到了list的具体实现,标准库中list是双向链表,标准库首先定义了list中一般节点基类的结构:

 struct _List_node_base
 {
      _List_node_base* _M_next;
      _List_node_base* _M_prev;

}

然后真正的节点结构如下:

struct _List_node : public _List_node_base

{
      _Tp _M_data;

}

此处定义的_List_node与之前ListNode包含的结构是一样的,但是此处把ListNode拆开,用基类定义指针,用包含数据的派生类继承自基类来表示完整的ListNode.由于_List_node是List的内部组成部分,所有_List-node 对于List是完全可见的,因此此处_List_node是用struct定义的,其内部默认是public权限。List的结构也ListNode一样,如下所示:

class _List_base
{
protected:
   struct _List_impl : public _Node_alloc_type
      {
         ......
      };
    _List_impl _M_impl;

    _List_node*  _M_get_node()
{
  return _M_impl._Node_alloc_type::allocate(1);
}
void _M_put_node(_List_node<_Tp>* __p)
{
  _M_impl._Node_alloc_type::deallocate(__p, 1);
}
public:
      ......
};

class list : protected _List_base
{
   ......
};

_List_base结构是为了管理内存而安排的,List的实际操作全是在_List中完成。这里看一下_List_base中的内部类_List_impl,原代码中_List_impL里只有构造函数,当然_List-impl会从基类中继承基类的方法,_list_base中有个_list_impl类型的数据成员_M_impl,下面还包括两个函数,这两个函数都有一个共同点,即函数体中都通过_M_impl调用自己的方法来完成_list_base中成员函数的功能,这就涉及到一种程序设计模式-桥接模式。桥接模式的作用是将抽象部分和它的实现部分分离,使他们都可以独立的变化。运用设计模式,可以使软件更具有扩展性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值