zoukankan      html  css  js  c++  java
  • 模拟实现STL中的list

    #pragma once

    #include<iostream>
    using namespace std;
    #include<assert.h>


    template<class T>
    struct __ListNode
    {
        __ListNode<T>* _prev;
        __ListNode<T>* _next;
        T _data;

        __ListNode(const T&x)
            :_data(x)
            , _prev(NULL)
            , _next(NULL)
        {}
    };

    template<class T,class Ref,class Ptr>
    struct __ListIterator
    {
        typedef __ListNode<T> Node;
        typedef __ListIterator<T, Ref, Ptr> Self;
        
        __ListIterator(Node* node)
            :_node(node)
        {}

        __ListIterator()
        {}

            Node* _node;

            Ref operator*()
            {
                return _node->_data;
            }
            
            Ptr operator->()
            {
                return &_node->_data;
            }
            
            bool operator==(const Self&s)const
            {
                return _node == s._node;
            }

            bool operator!=(const Self&s)const
            {
                return _node != s._node;
            }

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

            Self& operator++(int)
            {
                Self temp(_node);
                _node = _node->_next;
                return *this;
            }

            Self& operator--()
            {
                _node = _node->_prev;
                return *this;
            }

            Self& operator--(int)
            {
                Self tmp(_node);
                _node = _node->_prev;
                return *this;
            }
    };

    template<class T>
    class List
    {
        typedef __ListNode<T> Node;
    public:
        typedef __ListIterator<T, T&, T*> Iterator;   //迭代器
        typedef __ListIterator<T, const T&, const T*> ConstIterator;   //const迭代器

        Node* Buynode(const T&x)
        {
            Node* node = new Node(x);
            return node;
        }

        List()
        {
            _head = Buynode(T());
            _head->_next = _head;
            _head->_prev = _head;
        }

        //void PushBack(const T&x)
        //{
        //    Node* tail = _head->_prev;
        //    Node* tmp = Buynode(x);

        //    tail->_next = tmp->_next;
        //    tmp->_prev = tail;

        //    tmp->_prev = tail;
        //    tmp->_next = _head;
        //    //    //    tail->_next = tmp;
        //    //    //    tmp->_prev = tail;
        //    //
        //    //    //    tmp->_next = _head;
        //    //    //    _head->_prev = tmp;
        //}

        void PushBack(const T&x)
        {
            Insert(End(),x);
        }

        void PushFront(const T&x)
        {
            Insert(Begin(), x);
        }

        void Pop()
        {
            Erase(--End());
        }

        void PopFront()
        {
            Erase(Begin());
        }

        void Insert(Iterator pos,const T&x)   //在pos前面插入
        {
            Node* cur = pos._node;
            Node* prev = cur->_prev;  //在prev后面插入

            Node* tmp = Buynode(x);
            prev->_next = tmp->_next;
            tmp->_prev = prev;

            prev->_next = tmp;
            tmp->_next = cur;
            //        tmp->_next = cur;
            //        cur->_prev = tmp;
            //
            //        prev->_next = tmp;
            //        tmp->_prev = prev;
        }

        void Erase(Iterator pos)  //在pos前面删除
        {
            assert(pos != End());
            Node* cur = pos._node->_prev;  //要删除的元素
            Node* prev = cur->_prev;
            
            prev->_next = cur->_next;
            prev->_next = prev;
            delete cur;
        }

        Iterator Begin()
        {
            return Iterator(_head->_next);
        }

        Iterator End()
        {
            return Iterator(_head);
        }
    private:
        Node* _head;
    };


    void main()
    {
        //TestList();
        List<int> l;

        l.PushBack(1);
        l.PushBack(2);
        l.PushBack(3);
        l.PushBack(4);

        List<int>::Iterator it = l.Begin();
        while (it != l.End())
        {
            cout << *it << " ";
            ++it;
        }
        cout << endl;
    }

  • 相关阅读:
    InstallShield自定义对话框模板代码(转)
    破解汇编知识(转)
    Openrowset数据库远程操作
    SQL类似sleep延时语句
    C#结束线程
    JavaScript中相应ActiveX事件
    Visual C# .NET 命令行编辑器
    AfxBeginThread
    atoi,atol,strtod,strtol,strtoul类型转换(转)
    SQLServer PadLeft,PadRight
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/5873599.html
Copyright © 2011-2022 走看看