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;   //都赋空;

        }

  • 相关阅读:
    linux 如何使用密钥登录 (CentOs)
    linux修改ssh端口 以及禁止root远程登录 (实验机 CentOs)
    查看Windows端口及端口关闭方法
    使用 Linux 终端 SSH 登录 VPS
    修改Chrome默认搜索引擎为Google.com
    Windows 小技巧: 變更輸入法順序
    CentOS 安装BitTorrent Sync详细步骤
    Android手机部分名词浅谈
    PPTP模式跟L2TP模式有什么不同
    .CO域名快被这帮搞IT的玩坏了……
  • 原文地址:https://www.cnblogs.com/mysky007/p/11247860.html
Copyright © 2011-2022 走看看