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

        }

  • 相关阅读:
    PyCharm2019激活
    实时统计每天pv,uv的sparkStreaming结合redis结果存入mysql供前端展示
    Python批量删除mysql中千万级大量数据
    SpringBoot + thymeleaf 实现分页
    适合用设计模式解决的问题场景
    重新理解面向过程和面向对象编程
    优化前端单页面应用性能指南
    使用ts开发vue项目知识点1
    职场人的核心竞争力应该是什么
    重新理解原型链
  • 原文地址:https://www.cnblogs.com/mysky007/p/11247860.html
Copyright © 2020-2023  润新知