模拟实现stl中的list-创新互联

list中的接口有sort(默认是按照由小到大的顺序排,可以更改排序方式,也可排完后调用reverse()逆置)
模拟实现list即将list中的函数模拟实现,同样也分为五部分:构造与析构、容量、迭代器、元素访问、元素修改。
需要注意的问题是list中的迭代器,与vector中不同的是list不是顺序结构,所以我们要对迭代器进行封装,其使用规则也要在这个封装中自定义给出。vector中的使用原生态指针即可。
代码如下:

绍兴ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!
#include<iostream>
using namespace std;

namespace mine//自己定义的命名空间,为了防止与库中的list冲突
{

    template <class T>//定义了一个节点类
    class ListNode
    {
        public:
        ListNode(const T &data=T())//没有传参的话调用T类型对象的默认构造函数
        :_pPre(nullptr)
        , _pNext(nullptr)
        , _data(data)
        {
        }
        ListNode<T>*_pPre;
        ListNode<T>*_pNext;
        T _data;
    };

    template<class T>
    class Iterator
    {
    public:
        typedef ListNode<T> Node;//对节点类重命名,方便后面的使用
        typedef Iterator<T> Self;
        Iterator(Node *cur)//构造函数
            :_pCur(cur)
        {
        }

        T& operator *()//按照指针的方式进行引用
        {
            return _pCur->_data;
        }

        T *operator ->()
        {
            return &(_pCur->_data);
        }

        Self& operator++()//前置++
        {
            _pCur = _pCur->_pNext;
            return *this;
        }

        Self& operator++(int)//后置++
        {
            Self tmp(*this);
            _pCur = _pCur->_pNext;
            return *tmp;
        }

        Self& operator--()//前置--
        {
            _pCur = _pCur->_pPre;
            return *this;
        }

        Self &operator--(int)//后置--
        {
            Self tmp(*this);
            _pCur = _pCur->_pPre;
            return *tmp;
        }

        bool operator ==(const Self & l)
        {
            if (l._pCur==_pCur)
            {
                return true;
            }
            return false;
        }

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

        Node * _pCur;
    };

    template <class T>//list类
    class list
    {
    public:
        typedef ListNode<T> Node;
        typedef Iterator<T> iterator;
    public:
        //////////////////////////////////////////////////////////////
        //构造与析构
        typedef ListNode<T> Node;//对节点类型重命名,使用起来更加方便
        list()//默认构造函数,只创建一个头节点
        {
            CreatHead();
        }

        list(int n, const T& val)//构造n个值为val
        {
            CreatHead();
            for (int i=0; i < n; i++)
            {
                push_back(val);
            }
        }

        template<class iterator>
        list(iterator first, iterator end)//区间构造
        {
            CreatHead();
           while (first != end)
            {
                push_back(*first);
                first++;
            }
        }

        list(const list<T> &L)//拷贝构造
        {
            CreatHead();
            Node*cur = L._phead->_pNext;
           while (cur != L._phead)
            {
                push_back(cur->_data);
                cur = cur->_pNext;
            }
        }

        list <T>& operator=(const list<T> & l)//赋值运算符的重载
        {
            if (&l != this)
            {
                clear();
                Node*cur = l._phead->_pNext;
               while (cur != l._phead)
                {
                    push_back(cur->_data);
                    cur = cur->_pNext;
                }
            }
            return *this;
        }

        ~list()
        {
            clear();
            delete _phead;
        }

        //////////////////////////////////////////////////////////////
        //迭代器
        iterator begin()
        {
            return iterator(_phead->_pNext);
        }
        iterator end()
        {
            return iterator(_phead);
        }

        //////////////////////////////////////////////////////////////
        //容量
        int size()
        {
            int size = 0;
            Node*cur = _phead->_pNext;
           while (cur != _phead)
            {
                size++;
                cur = cur->_pNext;
            }
            return size;
        }

        bool empty()
        {
            if (_phead->_pNext == _phead)
            {
                return true;
            }
            return false;
        }

        void resize(int newsize, const T&data = T())
        {
            int oldsize = size();
            if (newsize > oldsize)
            {
                for (int i = oldsize; i < newsize; i++)
                {
                    push_back(data);
                }
            else
            {
                for (int i = newsize; i < oldsize; i++)
                {
                    pop_back();
                }
            }
            }
        }

        ///////////////////////////////
        // 元素访问
        T& front()
        {
            return _pHead->_pNext->_data;
        }

        const T& front()const
        {
            return _pHead->_pNext->_data;
        }

        T& back()
        {
            return _pHead->_pPre->_data;
        }

        const T& back()const
        {
            return _pHead->_pPre->_data;
        }

        //////////////////////////////////////////////////////////////
        //元素修改
        void push_back(const T& data)
        {
            insert(end(), data);
        }

        void pop_back()
        {
            erase(--end()); 
        }

        iterator insert(iterator pos,const T& data)
        {
            Node*cur = new Node(data);
            Node*tmp = pos._pCur;
            cur->_pNext = tmp;
            cur->_pPre = tmp->_pPre;
            cur->_pPre->_pNext = cur;
            tmp->_pPre = cur;
            return iterator(cur);
        }

        iterator erase(iterator pos)
        {
            Node*del = pos._pCur;
            if (del == _phead)
            {
                return end();
            }
            Node *ret = del->_pNext;
            del->_pPre->_pNext = del->_pNext;
            del->_pNext->_pPre = del->_pPre;
            delete del;
            return iterator(ret);
        }

        void clear()//头删
        {
            Node *cur = _phead->_pNext;
           while (cur != _phead)
            {
                _phead->_pNext = cur->_pNext;
                delete cur;
                cur = _phead->_pNext;
            }
            _phead->_pNext = _phead;
            _phead->_pPre = _phead;
        }

    private:
        void CreatHead()
        {
            _phead = new Node;
            _phead->_pPre = _phead;
            _phead->_pNext = _phead;
        }
    private:
        Node* _phead;
    };
};

int main()
{
    mine::list<int> l(5,10);
    mine::list<int> s(l);
    for (auto e : s)
    {
        cout << e;
    }
    system("pause");
    return 0;
}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

分享名称:模拟实现stl中的list-创新互联
分享地址:https://www.cdcxhl.com/article48/csochp.html

成都网站建设公司_创新互联,为您提供网站内链微信小程序企业网站制作企业建站用户体验静态网站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都定制网站网页设计