C++ list 源码学习

一. list  实例

#include<list> //调用系统的list,双向循环链表结构
using namespace std;
int main(void)
{    
    list<int> mylist;    
    for(int i = 1; i <= 10; i++)
    {        
        mylist.push_back(i);  //接口,末尾增加    
    }    
    
    list<int>::iterator it = mylist.begin(); //迭代器,    
    while(it != mylist.end())
    {        
        cout<<*it<<"-->"; //打印内部数字
++it;
} }

 

二. 源码学习

#ifndef _LIST_H   //条件宏编译,避免重复定义
#define _LIST_H#include<assert.h>   //断言引入的头文件
#include<malloc.h>   //申请空间所引入的头文件
template<class _Ty> //此处先不涉及空间置配器
class list{    //list类
  public:

    struct _Node;

  typedef struct _Node* _Nodeptr;  //指向节点的指针类型

  struct _Node{   //_Node这个是节点类型

          _Nodeptr _Prev;    //前驱节点

          _Nodeptr _Next;    //后继节点

          _Ty      _Value;   //模板数据类型

};

  struct _Acc {  //定义_Acc这个类型

        typedef struct _Node*& _Nodepref;      //指向节点类型指针的引用

        typedef _Ty&           _Vref;                        //这个数据类型的引用

        static _Nodepref _Next(_Nodeptr _P)  //静态方法, 返回值是节点指针的引用 ,参数是指向节点的指针

        {

    return ((_Nodepref)(*_P)._Next);  //:*_P得到这个节点,()强制类型转换的优先级没有.高,所以此时先取_Next,在进行强制类型转换的工作,返回一个指向节点指针的引用。

        }

  static _Nodepref _Prev(_Nodeptr _P)

        {

    return ((_Nodepref)(*_P)._Prev);

        }

  static _Vref _Value(_Nodeptr _P)

  {

    return ((_Vref)(*_P)._Value);}

  };

  public:  //以下的类型是_A这个类下面的类型,_A这个类在空间置配器中定义

        typedef typename _A::value_type           value_type;

        typedef typename _A::pointer_type         pointer_type;

        typedef typename _A::const_pointer_type   const_pointer_type;

        typedef typename _A::reference_type       reference_type;

        typedef typename _A::const_reference_type const_reference_type;

        typedef typename _A::size_type            size_type;  //这个类型其实就是size_tprivate:

        _Nodeptr  _Head;   //指向头结点的指针

     size_type _Size;   //有几个节点个数};#

三. 构造函数和析构函数

public:

    explicit list():_Head(_Buynode()),_Size(0)  //explicit显示调用此构造函数,给头一个指向,刚开始0个

    {}

    ~list()

    {     //释放空间和空间配置器有关,在现阶段先不关心。

        erase(begin(), end());  //调用开始,结束函数释放空间;

        _Freenode(_Head);       //释放头;

        _Head = 0, _Size = 0;   //都赋空;

    }

 

posted @ 2019-07-26 00:46  坚持,每天进步一点点  阅读(1266)  评论(0编辑  收藏  举报