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;
    };
  • 相关阅读:
    Druid 使用 Kafka 将数据载入到 Kafka
    Druid 使用 Kafka 数据加载教程——下载和启动 Kafka
    Druid 集群方式部署 —— 启动服务
    Druid 集群方式部署 —— 端口调整
    Druid 集群方式部署 —— 配置调整
    Druid 集群方式部署 —— 配置 Zookeeper 连接
    Druid 集群方式部署 —— 元数据和深度存储
    Druid 集群方式部署 —— 从独立服务器部署上合并到集群的硬件配置
    Druid 集群方式部署 —— 选择硬件
    Druid 独立服务器方式部署文档
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/4223826.html
Copyright © 2011-2022 走看看