C++ list 源码学习

Posted mysky007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;   //都赋空;

   

 

以上是关于C++ list 源码学习的主要内容,如果未能解决你的问题,请参考以下文章

C++学习记录:一个小线程池的源码分析

C++学习记录:一个小线程池的源码分析

C++学习记录:一个协程库的源码分析

从 《Accelerated C++》源码学习句柄类

C++学习记录:一个协程库的源码分析

C++学习记录:一个协程库的源码分析