zoukankan      html  css  js  c++  java
  • list 链表

    #include <list>
    #include <iostream>
    using std::list;
    
    /*
        双向环状链表
        //每一个结点 一个数据域 一个前驱指针 一个后驱指针
        随机插入方便0(1)  随机访问效率低0(n)
    */
    
    bool foo(int a) {
        return a % 2 == 0;
    }
    
    bool foo2(int a) {
        return a == 0;
    }
    
    int main()
    {
        //初始化列表
        list<int> list_test1;
        list<int> list_test2(5);//5个结点的链表 默认值是0
        list<int> list_test3(2,3);
        list<int> list_test4(list_test3);
        list<int> list_test5= list_test4;
    
        //末尾插入
        list_test1.push_back(10);
        list_test1.push_back(20);
        list_test1.push_back(30);
    
        //末尾删除
        list_test1.pop_back();
    
        //和vector的区别
        //排序
        list_test1.sort();
        //前侧插入
        list_test1.push_front(40);
        //前侧删除
        list_test1.pop_front();
    
        //merge 合并两个有序链表再排序
        list_test1.merge(list_test2);
    
        //清除指定值的元素 remove
        list_test1.remove(3);
    
        //清除满足条件的元素 remove_if  参数是返回bool的函数指针
        list_test1.remove_if(foo);
        list_test1.remove_if(foo2);//条件返回值必须是bool
    
        //splice 拼接结合
    
        //unique() 删除重复值,保证唯一
        list_test1.unique();
    
        for (auto& i : list_test1) {
            std::cout << i << std::endl;
        }
    }

    自写

    #pragma once
    #include <memory>
    
    using namespace std;
    /*
    list结点
    
        |next|---->|next|---->|next|
        |prev|<----|prev|<----|prev|
        |data|       |data|      |data|
    
    */
    template <typename T>
    struct __list_node
    {
        typedef __list_node* list_node_pointer;
        list_node_pointer    next;
        list_node_pointer    prev;
        T                    data;
    };
    
    /*
    list迭代器 操作容器
    */
    template <typename T>
    struct __list_iterator
    {
        typedef __list_iterator<T>    self;
        typedef __list_node<T> *    link_type;
    
        link_type ptr;//指向list结点的指针 头指针
    
        __list_iterator(link_type p = nullptr) :ptr(p) {}//构造
        __list_iterator(const self& that) :ptr(that.ptr) {}//拷贝构造
    
        bool operator==(const self& that) const
        {
            return this->ptr == that.ptr;
        }
        bool operator!=(const self& that) const
        {
            return this->ptr != that.ptr;
        }
        T& operator*()const
        {
            return ptr->data;
        }
        T* operator->()const
        {
            return &(operator*());
        }
        //迭代器前++ 返回下一个结点
        self& operator++()
        {
            ptr=ptr->next;//指针指向下一个结点
            return *this;
        }
    
        //后++ 先返回后自增
        self operator++()
        {
            self tmp = *this;
            ++*this;//调用了前面写的前++的操作
            return tmp;
        }
    
        //迭代器前-- 返回上一个
        self& operator--()
        {
            ptr = ptr->prev;//指针指向上一个结点
            return *this;
        }
    
        //后-- 先返回后自减
        self operator--()
        {
            self tmp = *this;
            --*this;
            return tmp;
        }
    };
    
    /*
    list
    */
    template <typename T>
    class MyList
    {
    protected:
        typedef __list_node<T> list_node;
        //空间配置器 内存池实现小块内存的分配机制
        /*
        大概实现
        一级空间配置器   直接封装了malloc free
        二级空间配置器   内存池  自有链表
        实现原理 用户申请内存》128? 一级:二级
    
        */
        allocator<list_node> nodeAllocator;
    
        typedef    T                    value_type;
        typedef    value_type*            pointer;
        typedef    const value_type*    const_pointer;
        typedef    value_type&            reference;
        typedef    size_t                size_type;
    
    public:
        typedef list_node*            link_type;
        typedef __list_iterator<T>    iterator;
    
    protected:
        //只要一个结点指针可以表示整个list
        link_type node; //指向list结点的指针    头指针
    
        //空间配置器  
        //分配新节点(内存) 不会进行构造
        list_node alloc_node()
        {
            return = nodeAllocator.allocate(sizeof(list_node));
        }
    
        //释放结点不会进行析构
        void dealloc_node(list_node p) 
        {
            nodeAllocator.deallocate(p);
        }
    
        //分配新结点(内存) 用value构造新节点里面内容
        list_node alloc_dtor_node(const T& value) 
        {
            //分配结点空间
            link_type p = alloc_node();
            //构造结点内容
            nodeAllocator.construct(&p->data, value);
        }
    
        //析构整个结点 释放内存
        void dealloc_dtor_node(list_node p)
        {
        
        }
    
        //空的初始化
        void empty_init()
        {
            node = alloc_node();//分配一个结点空间 让node指向他
            node->prev = node;//指向他自己
            node->next = node;
        }
    public:
        MyList()//链表初始化
        {
            empty_init()
        }
        ~MyList();
    
        iterator begin()
        {
            return node->next;
        }
        iterator begin() const
        {
            return node->next;
        }
        iterator end()
        {
            return node;
        }
        iterator end() const
        {
            return node;
        }
    
        bool empty()const
        {
            return node == node->next;//结点指向他自身
            //return node== node->prev;
        }
    
        iterator insert(iterator pos, const T& value)
        {
            //先创造一个结点
            link_type tmp = alloc_dtor_node(value);
            //寻找位置插入
            node->next = pos.node;
            node->prev = pos.prev;
    
            pos.node->prev->next = tmp;
            pos.node->prev = tmp;
        
            return tmp
        }
    
        void push_back(const T& value)
        {
            insert(end(), value);
        }
    private:
    
    };
  • 相关阅读:
    区块链初学者指南——五岁孩子都能理解
    推荐返利功能已上线——推荐好友下单,最高返45%
    干货|浅谈iOS端短视频SDK技术实现
    从单个系统到云翼一体化支撑,京东云DevOps推进中的一波三折
    体验京东云 Serverless+AI 人脸属性识别
    沙龙报名 | 云时代的架构演进—企业上云及云原生技术落地实践
    2020年9大顶级Java框架
    字符串函数
    linux添加用户
    unix/linux下线程私有数据实现原理及使用方法
  • 原文地址:https://www.cnblogs.com/long5683/p/11772514.html
Copyright © 2011-2022 走看看