STL中List的实现分析

来源:互联网 发布:武藏点胶机200s编程 编辑:程序博客网 时间:2024/05/16 13:03

之前自己动手写了一个单向链表的简易实现,就好奇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中成员函数的功能,这就涉及到一种程序设计模式-桥接模式。桥接模式的作用是将抽象部分和它的实现部分分离,使他们都可以独立的变化。运用设计模式,可以使软件更具有扩展性。

0 0
原创粉丝点击