首页 > 代码库 > (C++ STL)list的实现

(C++ STL)list的实现

#include <iostream>  
using namespace std;  
//採用迭代器和空间配置器所实现的双向链表的基本功能  
template<class _Ty,class _A = allocator<_Ty> >                                    
//定义模板类  
class list                                             
//list类  
{  
public:   
    typedef size_t size_type;                          
    //类型重定义  
protected:  
    struct _Node;                                      
    //结构体_Node  
    friend struct _Node;                               
    //友元  
    typedef _Node* _Nodeptr;                           
    //类型重定义  
    struct _Node                                       
    //结构体定义  
    {  
        _Nodeptr _Next,_Prev;  
        _Ty _Value;  
    };  
protected:  
    _A allocator;                                       
    _Nodeptr _Head;                                    
    size_type _Size;  
public:  
    typedef list<_Ty,_A> _Myt;  
    typedef _A allocator_type;           
    //该类型是模板參数A的同义词  
    typedef size_t size_type;            
    //正整数类型  
    typedef ptrdiff_t difference_type;   
    //整数类型  
    typedef _Ty* pointer;                
    //指向_Ty的指针  
    typedef const _Ty* const_pointer;    
    //指向_Ty的常量指针  
    typedef _Ty& reference;              
    //_Ty的引用  
    typedef const _Ty& const_reference;  
    //_Ty的常量引用  
    typedef _Ty value_type;              
    //对象类型_Ty  
    class iterator;                      
    //訪问list的迭代器  
    class const_iterator;                
    //訪问list的常量迭代器  
    friend class const_iterator;         
    //友元  
    class const_iterator : public _Bidit<_Ty, difference_type>  
    //继承  
    {  
    public:                                               
        //共同拥有成员  
        _Nodeptr _Mynode() const                         
        //指向当前结点  
        {  
            return (_Ptr);  
        }  
        const_iterator()                                  
        //默认构造函数  
        {}  
        const_iterator(_Nodeptr _P):_Ptr(_P)             
        //參数为指针的构造函数  
        {}  
        const_iterator(const iterator& _X):_Ptr(_X._Ptr)  
        //參数为訪问list的常量迭代器的构造函数  
        {}  
        const_reference operator*() const                 
        //获取当前_Ty的常量的值  
        {  
            return _Ptr->_Value;  
        }  
        const_pointer operator->() const                  
        //?  
        {  
            return (&**this);  
        }  
        const_iterator& operator++()                      
        //前置++的引用  
        {  
            _Ptr = _Ptr->_Next;  
            return (*this);   
        }  
        const_iterator operator++(int)                    
        //后置++的引用  
        {  
            const_iterator _Tmp = *this;  
            ++*this;  
            return (_Tmp);  
        }  
        const_iterator& operator--()                      
        //前置--的引用  
        {  
            _Ptr = _Ptr->_Prev;  
            return (*this);   
        }  
        const_iterator operator--(int)                    
        //后置--的引用  
        {  
            const_iterator _Tmp = *this;  
            --*this;  
            return (_Tmp);   
        }  
        bool operator==(const const_iterator& _X) const   
        //推断是否相等  
        {  
            return (_Ptr == _X._Ptr);  
        }  
        bool operator!=(const const_iterator& _X) const   
        //推断是否不等  
        {  
            return (!(*this == _X));                   
        }  
    protected:                                            
        //保护成员  
        _Nodeptr _Ptr;  
    };  
    friend class iterator;                                
    //友元  
    class iterator : public const_iterator                
    //继承  
    {  
    public:  
        iterator()                                        
        //默认构造函数  
        {}  
        iterator(_Nodeptr _P): const_iterator(_P)        
        //參数为指针的构造函数  
        {}  
        reference operator*() const                       
        //获取当前_Ty的值  
        {  
            return _Ptr->_Value;   
        }  
        _Ty* operator->() const                           
        //?  
        {  
            return (&**this);   
        }  
        iterator& operator++()                            
        //前置++的引用  
        {  
            _Ptr = _Ptr->_Next;  
            return (*this);  
        }  
        iterator operator++(int)                           
        //后置++的引用  
        {  
            iterator _Tmp = *this;  
            ++*this;  
            return (_Tmp);  
        }  
        iterator& operator--()                            
        //前置--的引用  
        {  
            _Ptr = _Ptr->_Prev;  
            return (*this);   
        }  
        iterator operator--(int)                           
        //后置--的引用  
        {  
            iterator _Tmp = *this;  
            --*this;  
            return (_Tmp);  
        }  
        bool operator==(const iterator& _X) const          
        //推断是否相等  
        {  
            return (_Ptr == _X._Ptr);  
        }  
        bool operator!=(const iterator& _X) const          
        //推断是否不等  
        {  
            return (!(*this == _X));  
        }  
    };  
public:  
    _Nodeptr _Buynode(_Nodeptr _Narg = 0, _Nodeptr _Parg = 0)     
    //购买结点  
    {  
        _Nodeptr _S = (_Nodeptr)allocator._Charalloc(   //开辟空间  
            1 * sizeof (_Node));  
        _S->_Next = _Narg != 0 ? _Narg : _S;;  
        _S->_Prev = _Parg != 0 ? _Parg : _S;  
        return (_S);   
    }  
    void _Freenode(_Nodeptr _S)                                  
    //释放空间  
    {  
        allocator.deallocate(_S, 1);   
    }  
    void _Splice(iterator _P, _Myt& _X, iterator _F, iterator _L)  
    //拼接  
    {  
        if (allocator == _X.allocator)                 //将两个拼接到一起,_X清空  
        {  
            (_L._Mynode())->_Prev->_Next = _P._Mynode();  
            (_F._Mynode())->_Prev->_Next = _L._Mynode();  
            (_P._Mynode())->_Prev->_Next = _F._Mynode();  
            _Nodeptr _S = (_P._Mynode())->_Prev;  
            (_P._Mynode())->_Prev =(_L._Mynode())->_Prev;  
            (_L._Mynode())->_Prev =(_F._Mynode())->_Prev;  
            (_F._Mynode())->_Prev = _S;   
        }  
        else                                          //将_X中的链表数值加入到_P中,_X清空  
        {  
            insert(_P, _F, _L);  
            _X.erase(_F, _L);   
        }  
    }  
    void _Xran() const                                         
    //抛出异常  
    {  
        _THROW(out_of_range, "invalid list<T> subscript");     
    }  
public:  
    size_type size() const                                     
    //长度  
    {  
        return (_Size);   
    }  
    bool empty() const                                         
    //判空  
    {  
        return (size() == 0);   
    }  
    _A get_allocator() const                                   
    //返回空间配置器  
    {  
        return (allocator);  
    }  
    void resize(size_type _N, _Ty _X = _Ty())                  
    //又一次定义链表长度  
    {  
        if (size() < _N)  
        {  
            insert(end(), _N - size(), _X);  
        }  
        else  
        {  
            while (_N < size())  
            {  
                pop_back();   
            }  
        }  
    }  
    size_type max_size() const                                  
    //返回链表最大可能长度  
    {  
        return (allocator.max_size());  
    }  
    reference front()                                           
    //返回第一个元素的引用  
    {  
        return (*begin());  
    }  
    const_reference front() const                               
    //返回第一个元素的常量引用  
    {  
        return (*begin());  
    }  
    reference back()                                           
    //返回最后一元素的引用  
    {  
        return (*(--end()));   
    }  
    const_reference back() const                               
    //返回最后一元素的常量引用  
    {  
        return (*(--end()));  
    }  
    _Myt& operator=(const _Myt& _X)                             
    //运算符构造函数  
    {  
        if (this != &_X)  
        {  
            iterator _F1 = begin();  
            iterator _L1 = end();  
            const_iterator _F2 = _X.begin();  
            const_iterator _L2 = _X.end();  
            for (; _F1 != _L1 && _F2 != _L2; ++_F1, ++_F2)  
            {  
                *_F1 = *_F2;  
            }  
            erase(_F1, _L1);  
            insert(_L1, _F2, _L2);  
        }  
        return (*this);  
    }  
public:  
    explicit list():_Head(_Buynode()), _Size(0)                 
    //空链表  
    {}  
    explicit list(const _Ty& _V):_Head(_Buynode()), _Size(0)    
    //建一个含_V个默认值是0的元素的链表  
    {  
        insert(begin(),_V,0);  
    }  
    explicit list(size_type _N, const _Ty& _V):_Head(_Buynode()), _Size(0)  
    //建一个含_V个元素的链表。值都是_N  
    {  
        insert(begin(),_N, _V);  
    }  
    list(const _Myt& _X): _Head(_Buynode()), _Size(0)  
    //建一个_X的copy链表  
    {  
        insert(begin(), _X.begin(), _X.end());  
    }  
    list(const _Ty *_F, const _Ty *_L): _Head(_Buynode()), _Size(0)  
    //一个区域的元素[_First, _Last)。  
    {  
        insert(begin(), _F, _L);  
    }  
    typedef const_iterator _It;  
    list(_It _F, _It _L):_Head(_Buynode()), _Size(0)               
    //常量迭代器  
    {  
        insert(begin(), _F, _L);   
    }  
    iterator begin()                                               
    //迭代器第一个节点  
    {  
        return iterator(_Head->_Next);  
    }  
    const_iterator begin() const                                    
    //常量迭代器第一个节点  
    {  
        return (const_iterator(_Head->_Next));   
    }  
    iterator end()                                                 
    //返回最后一个元素的下一位置的指针  
    {  
        return iterator(_Head);  
    }  
    const_iterator end() const  
    //返回最后一个元素的下一位置的指针  
    {  
        return (const_iterator(_Head));  
    }  
    iterator insert(iterator _P,const _Ty& _X)                     
    //在_P之前插入结点  
    {  
        _Nodeptr _S = _P._Mynode();  
        _S->_Prev = _Buynode(_S,_S->_Prev);  
        _S = _S->_Prev;  
        _S->_Prev->_Next = _S;  
        _S->_Value = http://www.mamicode.com/_X;  >

(C++ STL)list的实现