zoukankan      html  css  js  c++  java
  • 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;   //都赋空;

        }

  • 相关阅读:
    水煮栗子
    张至顺道长羽化登仙+说修行(道经每日清修)
    治疗口腔溃疡的穴位按摩方法
    一年四季的时令蔬菜水果表
    坐式养生八段锦口诀及练法图解
    SOA建设规划
    生鲜电商业务流程规划
    产品定义到产品推广的思路
    生鲜财务核算
    税率与存货、供应商关系
  • 原文地址:https://www.cnblogs.com/mysky007/p/11247860.html
Copyright © 2011-2022 走看看