#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:

};