zoukankan      html  css  js  c++  java
  • list实现

    //链表结点结构
    template <class T>
    struct _list_node
    {
        typedef void *void_pointer;
        //指针类型为void *,其实可以设为_list_node<T>*
        void_pointer prev;
        void_pointer next;
        T data;
    };
    
    /*
    迭代器有五种类型,Input Iterator,output Iterator,Forward Iterator只支持++,Biderectional Iterator支持++、--,Random Access Iterator支持
    所有运算,效率最高
    */
    struct input_iterator_tag{};
    struct output_iterator_tag{};
    struct forward_iterator_tag :public input_iterator_tag{};
    struct bidirectional_iterator_tag :public forward_iterator_tag{};
    struct random_access_iterator_tag :public bidirectional_iterator_tag{};
    
    //list迭代器设计
    template <class T,class Ref,class Ptr>
    struct _list_iterator
    {
        typedef _list_iterator<T, T&, T*> iterator;
        typedef _list_iterator<T, Ref, Ptr>self;
    
        //traits萃取
        typedef bidirectional_iterator_tag iterator_category;
        typedef T value_type;
        typedef Ptr pointer;
        typedef Ref reference;
        typedef ptrdiff_t difference_type;
        typedef _list_node<T>* link_type;
        typedef size_t size_type;
    
        link_type node;//迭代器内部的普通指针,指向list的结点
    
        //构造函数
        _list_iterator(link_type x) :node(x){}
        _list_iterator(){}
        _list_iterator(const iterator& x) :node(x.node){}
    
        reference operator*()const
        {
            return (*node).data;
        }
        pointer operator->()const
        {
            return &(operator*());
        }
    
        //前增量
        self &operator++()
        {
            node = (link_type)((*node).next);
            return *this;
        }
        //后增量
        self operator++(int)
        {
            self tmp = *this;
            ++*this;
            return tmp;
        }
    
        self &operator--()
        {
            node = (link_type)((*node).prev);
            return *this;
        }
    
        self operator--(int)
        {
            self tmp = *this;
            --*this;
            return tmp;
        }
    };
    
    //SGI list是一个环状双向链表
    template<class T,class Alloc=alloc>
    class list
    {
    protected:
        typedef _list_node<T> list_node;
    public:
        typedef list_node* link_type;
    
    protected:
        link_type node;//该指针表示整个环状双向链表,可使其指向置于尾端的一个空白结点
        //list缺省使用alloc作为空间配置器,并据此另外定义了list_node_allocator,为的是更方便地以节点大小为配置单位
        typedef simple_alloc<list_node, Alloc>list_node_allocator;
    };
  • 相关阅读:
    C++服务器开发之基于对象的编程风格
    C++服务器开发之笔记三
    InstallShield 脚本语言学习笔记
    Win.ini和注册表的读取写入
    MFC中如何画带实心箭头的直线
    UE4新手引导之下载和安装虚幻4游戏引擎
    SQLServer · BUG分析 · Agent 链接泄露分析(转载)
    mysql5.6版本开启数据库查询日志方法
    远程读取json数据并写入数据库
    js中的什么时候需要用new来实例化?
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/4223826.html
Copyright © 2011-2022 走看看