前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >List的模拟实现

List的模拟实现

作者头像
发布2024-11-17 12:32:05
发布2024-11-17 12:32:05
6200
代码可运行
举报
文章被收录于专栏:转自CSDN转自CSDN
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
复制
#include<iostream>
using namespace std;


namespace mylist
{
    
    template<class T>
    struct ListNode
    {
        ListNode(const T& val = T()):_val(val),_pPre(nullptr),_pNext(nullptr){}
        ListNode<T>* _pPre;
        ListNode<T>* _pNext;
        T _val;
    };


    
    template<class T, class Ref, class Ptr>
    class ListIterator
    {
        typedef ListNode<T>* PNode;
        typedef ListIterator<T, Ref, Ptr> Self;

    public:
        PNode node()
        {
            return _pNode;
        }
        ListIterator(PNode pNode = nullptr):_pNode(pNode){}
        ListIterator(const Self& l):_pNode(l._pNode){}
        T& operator*()
        {
            return _pNode->_val;
        }
        T* operator->()
        {
            return _pNode;
        }
        Self& operator++()
        {
            _pNode = _pNode->_pNext;
            return *this;
        }
        Self operator++(int)
        {
            Self p = *this;
            _pNode = _pNode->_pNext;
            return Self(p);
        }
        Self& operator--()
        {
            _pNode = _pNode->_pPre;
            return *this;
        }
        Self& operator--(int)
        {
            Self p = *this;
            _pNode = _pNode->_pPre;
            return Self(p);
        }
        bool operator!=(const Self& l) const
        {
            return _pNode != l._pNode;
        }
        bool operator==(const Self& l) const
        {
            return _pNode == l._pNode;
        }
    private:
        PNode _pNode;
    };

    template<class Iterator, class Ref, class Ptr>
    struct Reverse_iterator
    {
        typedef Reverse_iterator<Iterator, Ref, Ptr> Self;

        Reverse_iterator(Iterator it):_it(it){}
        Ref operator*()
        {
            Iterator t(_it);
            return *t;
        }

        Ptr operator->()
        {
            return &(operator*());
        }

        //
        // 迭代器支持移动
        Self& operator++()
        {
            Self temp(*this);
            --_it;
            return temp;
        }

        Self operator++(int)
        {
            Self temp(*this);
            --_it;
            return temp;
        }

        Self& operator--()
        {
            ++_it;
            return *this;
        }

        Self operator--(int)
        {
            Self temp(*this);
            ++_it;
            return temp;
        }

        bool operator!=(const Self& l) const
        {
            return _it != l._it;
        }

        bool operator==(const Self& l) const
        {
            return _it != l._it;
        }
        
        Iterator _it;
    };
    
    template<class T>
    class list
    {
        typedef ListNode<T> Node;
        typedef Node* PNode;
    public:
        typedef ListIterator<T, T&, T*> iterator;

        typedef ListIterator<T, const T&, const T&> const_iterator;

        typedef Reverse_iterator<iterator, const T&, const T*> const_Reverse_iterator;

        typedef Reverse_iterator<iterator,T&,T*> Reverse_iterator;


    public:

        list()
        {
            CreateHead();
        }

        list(int n, const T& value = T())
        {
            CreateHead();
            while(n--)
            push_front(value);
        }
        template <class Iterator>
        list(Iterator first, Iterator last)
        {
            CreateHead();
            while (first != last)
            {
                push_back(*first);
                first++;
            }
        }
        list(const list<T>& l)
        {
            CreateHead();
            for (auto it : l)
            {
                push_back(it);
            }
        }
        list<T>& operator=(const list<T> l)
        {
            CreateHead();
            for (auto it : l)
            {
                push_back(it);
            }
        }
        ~list()
        {
            clear();
            delete _pHead;
            _pHead = nullptr;
        }


        ///
        // List Iterator
        iterator begin() { return iterator(_pHead->_pNext); }
        iterator end() {return iterator(_pHead);};
        const_iterator begin() const { return const_iterator(_pHead->_pNext); }
        const_iterator end() const { return const_iterator(_pHead); }

        Reverse_iterator rbegin()
        {
            return Reverse_iterator(--end());
        }

        Reverse_iterator rend()
        {
            return Reverse_iterator(--begin());
        }

        const_Reverse_iterator rbegin()const
        {
            return const_Reverse_iterator(--end());
        }

        const_Reverse_iterator rend()const
        {
            return const_Reverse_iterator(--begin());
        }

        ///
        // List Capacity
        size_t size()const
        {
            size_t s = 0;
            const_iterator it = this->begin();
            while (it != this->end())
            {
                it++;
                s++;
            }
            return s;
        }
        bool empty()const
        {
            return _pHead == _pHead->_pNext;
        }


        
        // List Access
        T& front() { return _pHead->_pNext->_val; }
        const T& front()const { return _pHead->_pNext->_val; }
        T& back() { return _pHead->_pPre->_val; }
        const T& back()const { return _pHead->_pPre->_val; }


        
        // List Modify
        void push_back(const T& val) { insert(end(), val); }
        void pop_back() { erase(--end()); }
        void push_front(const T& val) { insert(begin(), val); }
        void pop_front() { erase(begin()); }
        // 在pos位置前插入值为val的节点
        iterator insert(iterator pos, const T& val)
        {
            PNode tmp = new Node(val);
            tmp->_pNext = pos.node();
            tmp->_pPre = pos.node()->_pPre;

            pos.node()->_pPre->_pNext = tmp;
            pos.node()->_pPre = tmp;
            return iterator(tmp);
        }
        // 删除pos位置的节点,返回该节点的下一个位置
        iterator erase(iterator pos)
        {
            PNode it = pos.node()->_pNext;
            PNode p = pos.node();
            p->_pNext->_pPre = p->_pPre;
            p->_pPre->_pNext = p->_pNext;
            delete p;
            return iterator(it);
        }
        void clear()
        {
            while (_pHead != _pHead->_pNext)
            {
                pop_front();
            }
        }
        void swap(list<T>& l)
        {
            PNode tmp = l._pHead;
            l._pHead = _pHead;
            _pHead = tmp;
        }
    private:
        void CreateHead()
        {
            _pHead = new Node;
            _pHead->_pNext = _pHead;
            _pHead->_pPre = _pHead;
        }
        PNode _pHead;
    };
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档