源码阅读笔记

vector的源码真是太长了,今天用了一个下午和一个晚上看和注释了前面的一千行左右

p.s.博客园的代码高亮真是太垃圾, 如果想要阅读带注释的源码,推荐粘贴到VS2015里,然后按ctrl+z取消自动格式化,用我格式化好的样子,并在最前面#include <vector>和using namespace std,这样就能带高亮的看我加了注释的代码了

花了不短的时间弄明白了vector奇怪的继承方式,用我自己创造的一种标记记法记了下来

_Vector_val<_Val_types>: _Container_base
{
'namely':
    _Val_types = _Vec_base_types<_Ty, _Alloc>::_Val_types

'use':
    _Val_types::pointer
}

_Vec_base_types<_Ty, _Alloc>
{
'namely':
    _Ty = 'value'
    _Alloc = 'allocator'

'define':
    _Val_types <= _Simple_types, _Vec_iter_types
}

_Vector_alloc<_Alloc_types>
{
'namely':
    _Alloc_types = _Vec_base_types<_Ty, _Alloc>

'alias':
    _Val_types = _Alloc_types::_Val_types

'use':
    _Vetor_val<_Val_types>
}

vector: _Vector_alloc<_Vec_base_types<_Ty, _Alloc>>
{   
}

简单说,vector继承自_Vector_alloc<T>,_Vector_alloc使用模板参数T内的类型在内部构造_Vector_val<T'>的实例,_Vector_val内部使用模板参数T'内的类型,构造出需要被封装的3个指针:first,last和end

_Vec_base_types和_Val_types都是一个类型包,里面包了各种抽取出来的类型,其中_Val_types由_Vec_base_types定义

下面是原代码注释

template<class _Value_type>
struct _Simple_types
/*
简单类的类型别名
*/
{
    typedef _Value_type       value_type;
    typedef size_t            size_type;
    typedef ptrdiff_t         difference_type;
    typedef value_type*       pointer;
    typedef const value_type* const_pointer;
    typedef value_type&       reference;
    typedef const value_type& const_reference;
};

template<class _Ty,
         class _Alloc0>
struct _Vec_base_types
/*
这个类获取了和vector本身相关的各种类型
*/
{
    typedef _Alloc0                                                         _Alloc;
    /*
    _Alloc0就是vector的allocator类型参数,默认是allocator<_Ty>
    */

    typedef _Vec_base_types<_Ty, _Alloc>                                    _Myt;
    /*
    这个类本体的类型别名
    */

    typedef _Wrap_alloc<_Alloc>                                             _Alty0;
    /*
    用来抽取这个allocator的traits的包装
    */

    typedef typename _Alty0::template rebind<_Ty>::other                    _Alty;
    /*
    rebind<_Ty>::other 返回 allocator<_Ty>
    如果有奇怪的vector的allocator<T>的T不是元素的T,这个就有用了
    */

    typedef typename _If<_Is_simple_alloc<_Alty>::value,
                         /*
                         获取value_type的traits的包装
                         如果_Alty是simple_alloc————这个后面写清楚
                         */
                         _Simple_types<typename _Alty::value_type>,
                         /*
                         就使用前面的_Simple_types把相关类型抽取出来
                         */
                         _Vec_iter_types<typename _Alty::value_type,
                                         typename _Alty::size_type,
                                         typename _Alty::difference_type,
                                         typename _Alty::pointer,
                                         typename _Alty::const_pointer,
                                         typename _Alty::reference,
                                         typename _Alty::const_reference>
                        /*
                        否则手动指定_Alty中抽取的类型作为_Val_types的类型包装
                        */
                        >::type                                             _Val_types;
    /*
    为什么需要这个判断呢,因为C++允许用户把一个类抽象的完全不像样子,包括
    修改各种与之相关的类型的定义,比如指针,引用
    重载运算符使之有不同的行为,比如取地址运算符
    这时候如果用这样改的乱七八糟的类接入stl,就需要用户自己提供一个allocator<T>特化
    为了在stl容器内部的实现中仍然使用原生的T*,T&等类型,就需要这种trick,恢复一个类本来的面目
    */
};

template<class _Alty>
struct _Is_simple_alloc
/*
当满足如下情况时,一个allocator<Ty>一个simple allocator
*/
    : _Cat_base<is_same<typename _Alty::size_type, size_t>::value
                /*
                _Cat_base把一个基本类型的值v包装成可以继承的class,内含一个value,值是这个v
                */
                && is_same<typename _Alty::difference_type,
                           ptrdiff_t
                          >::value
                /*
                它的difference_type是ptrdiff_t即int
                */
                && is_same<typename _Alty::pointer,
                           typename _Alty::value_type*
                          >::value
                /*
                它的指针是value_type*
                */
                && is_same<typename _Alty::const_pointer,
                           const typename _Alty::value_type*
                          >::value
                /*
                它的常量指针是const value_type*
                */
                && is_same<typename _Alty::reference,
                           typename _Alty::value_type&
                          >::value
                /*
                它的引用是value_type&
                */
                && is_same<typename _Alty::const_reference,
                           const typename _Alty::value_type&
                          >::value
                /*
                它的常量引用是const value_type&
                */
               >
            
{
    //这里继承了基类中的const static bool value,值是true或者false,表示一个类是不是simple allocator
};

template<class _Val_types>
/*
_Val_types,前面与vector成员类型T相关联的其他类型
*/
class _Vector_val: public _Container_base
/*
vector的私有成员的包装,_Myfirst, _Mylast, _Myend
*/
{
public:
    typedef _Vector_val<_Val_types>              _Myt;
    /*
    类自己的别名
    */
    typedef typename _Val_types::value_type      value_type;
    typedef typename _Val_types::size_type       size_type;
    typedef typename _Val_types::difference_type difference_type;
    typedef typename _Val_types::pointer         pointer;
    typedef typename _Val_types::const_pointer   const_pointer;
    typedef typename _Val_types::reference       reference;
    typedef typename _Val_types::const_reference const_reference;
    /*
    给这些相关类型又取了个别名
    */
    typedef _Vector_iterator<_Myt>               iterator;
    typedef _Vector_const_iterator<_Myt>         const_iterator;
    /*
    迭代器之后讲
    */

    _Vector_val()
    /*
    简单的初始化
    */
    {
        _Myfirst = pointer();
        _Mylast = pointer();
        _Myend = pointer();
    }

    pointer _Myfirst;
    pointer _Mylast;
    pointer _Myend;
};


template<class _Alloc_types>
/*
_Alloc_types = _Vector_base_type
*/
class _Vector_alloc
/*
放vector的allocator的地方
*/
{
public:
    typedef _Vector_alloc<_Alloc_types>          _Myt;
                                                 
    typedef typename _Alloc_types::_Alloc        _Alloc;
    typedef typename _Alloc_types::_Alty         _Alty;
    typedef typename _Alloc_types::_Val_types    _Val_types;

    typedef typename _Val_types::value_type      value_type;
    typedef typename _Val_types::size_type       size_type;
    typedef typename _Val_types::difference_type difference_type;
    typedef typename _Val_types::pointer         pointer;
    typedef typename _Val_types::const_pointer   const_pointer;
    typedef typename _Val_types::reference       reference;
    typedef typename _Val_types::const_reference const_reference;

    typedef _Vector_iterator<_Vector_val<_Val_types>> iterator;
    typedef _Vector_const_iterator<_Vector_val<_Val_types>> const_iterator;

private:
    _Compressed_pair<_Alty, _Vector_val<_Val_types>> _Mypair;
    /*
    简单说,如果第一个模板参数是一个无数据成员的类
    那_Compressed_pair通过继承自第一个模板参数
    来避免第一个模板参数的实例占用1字节的空间
    */
public:
#if _ITERATOR_DEBUG_LEVEL == 0
    /*
    release模式下的成员函数,去掉了迭代器范围检查
    _Vector_val的_Container_base基类是空类
    */
    _Vector_alloc(const _Alloc& _Al = _Alloc())
        : _Mypair(_One_then_variadic_args_t(), _Al)
    {	// construct allocator from _Al
    }

    _Vector_alloc(_Alloc&& _Al)
        : _Mypair(_One_then_variadic_args_t(), _STD move(_Al))
    {	// construct allocator from _Al
    }

    void _Copy_alloc(const _Alty& _Al)
    {	// replace old allocator
        _Pocca(_Getal(), _Al);
    }

    void _Move_alloc(_Alty& _Al)
    {	// replace old allocator
        _Pocma(_Getal(), _Al);
    }

    void _Swap_alloc(_Myt& _Right)
    {	// swap allocators
        _Pocs(_Getal(), _Right._Getal());
    }

#else /* _ITERATOR_DEBUG_LEVEL == 0 */
    /*
    debug模式下,_Vector_val的_Container_base基类里有一个proxy成员
    是一个保存着这个vector所有迭代器的链表
    release模式下_Container_base是空类
    */
    _Vector_alloc(const _Alloc& _Al = _Alloc())
        : _Mypair(_One_then_variadic_args_t(), _Al)
    /*
    构造allocator,使用_Al显式构造_Mypair的第一个成员
    */
    {
        _Alloc_proxy();
        /*
        构造proxy链表
        */
    }

    _Vector_alloc(_Alloc&& _Al)
        : _Mypair(_One_then_variadic_args_t(), _STD move(_Al))
    {
        _Alloc_proxy();
    }
    /*
    移动构造
    */

    ~_Vector_alloc() _NOEXCEPT
    {	// destroy proxy
        _Free_proxy();
    }
    /*
    析构,删除proxy
    */

    void _Copy_alloc(const _Alty& _Al)
    /*
    拷贝allocator
    */
    {
        _Free_proxy();
        _Pocca(_Getal(), _Al);
        /*
        按需把_Al拷贝过来
        pocca = propagate pn copy assignment
        */
        _Alloc_proxy();
    }

    void _Move_alloc(_Alty& _Al)
    {	// replace old allocator
        _Free_proxy();
        _Pocma(_Getal(), _Al);
        /*
        按需把_Al移动过去
        pocma = propagate on move assignment
        */
        _Alloc_proxy();
    }

    void _Swap_alloc(_Myt& _Right)
    {	// swap allocators
        _Pocs(_Getal(), _Right._Getal());
        /*
        按需交换两个allocator
        pocs = propagate on container swap
        */
        _Swap_adl(_Myproxy(), _Right._Myproxy());
    }

    void _Alloc_proxy()
    /*
    分配一个proxy
    */
    {
        typename _Alty::template rebind<_Container_proxy>::other
            _Alproxy(_Getal());
        /*先构造proxy的allocator*/
        _Myproxy() = _Alproxy.allocate(1);
        _Alproxy.construct(_Myproxy(), _Container_proxy());
        /*构造proxy的头节点*/
        _Myproxy()->_Mycont = &_Get_data();
        /*
        头节点的容器指针指向这个类的_Vector_val,也就是实际存储着三个指针的那个东西的地址
        */
    }

    void _Free_proxy()
    /*
    释放所有的proxy
    */
    {
        typename _Alty::template rebind<_Container_proxy>::other
            _Alproxy(_Getal());
        _Orphan_all();
        _Alproxy.destroy(_Myproxy());
        _Alproxy.deallocate(_Myproxy(), 1);
        _Myproxy() = 0;
    }

    _Iterator_base12 **_Getpfirst() const
    /*
    获取迭代器链表的头的指针
    */
    {
        return (_Get_data()._Getpfirst());
    }

    _Container_proxy * & _Myproxy() _NOEXCEPT
    /*
    返回迭代器链表头的引用
    */
    {
        return (_Get_data()._Myproxy);
    }

    _Container_proxy * const & _Myproxy() const _NOEXCEPT
    /*
    返回常量引用
    */
    {
        return (_Get_data()._Myproxy);
    }
#endif /* _ITERATOR_DEBUG_LEVEL == 0 */

    void _Orphan_all()
    {
        _Get_data()._Orphan_all();
    }

    void _Swap_all(_Myt& _Right)
    {
        _Get_data()._Swap_all(_Right._Get_data());
    }

    _Alty& _Getal() _NOEXCEPT
    {
        return (_Mypair._Get_first());
    }
    const _Alty& _Getal() const _NOEXCEPT
    {
        return (_Mypair._Get_first());
    }
    /*
    返回allocator<_Ty>还记得前面有可能传入的allocator<T>的T不是value_type吗
    这里返回的一定是allocator<_Ty>
    */

    _Vector_val<_Val_types>& _Get_data() _NOEXCEPT
    {	// return reference to _Vector_val
        return (_Mypair._Get_second());
    }
    const _Vector_val<_Val_types>& _Get_data() const _NOEXCEPT
    {	// return const reference to _Vector_val
        return (_Mypair._Get_second());
    }
    /*
    获取三个指针及其本体
    */

    pointer& _Myfirst() _NOEXCEPT
    {	// return reference to _Myfirst
        return (_Get_data()._Myfirst);
    }
    const pointer& _Myfirst() const _NOEXCEPT
    {	// return const reference to _Myfirst
        return (_Get_data()._Myfirst);
    }
    pointer& _Mylast() _NOEXCEPT
    {	// return reference to _Mylast
        return (_Get_data()._Mylast);
    }
    const pointer& _Mylast() const _NOEXCEPT
    {	// return const reference to _Mylast
        return (_Get_data()._Mylast);
    }
    pointer& _Myend() _NOEXCEPT
    {	// return reference to _Myend
        return (_Get_data()._Myend);
    }
    const pointer& _Myend() const _NOEXCEPT
    {	// return const reference to _Myend
        return (_Get_data()._Myend);
    }
    /*
    获取三个指向位置的指针的引用
    */
};

template<class _Ty, class _Alloc = allocator<_Ty>>
class vector: public _Vector_alloc<_Vec_base_types<_Ty, _Alloc>>
/*
vector本体,继承自_Vector_alloc的包装
*/
{
public:
    typedef vector<_Ty, _Alloc>                         _Myt;
    typedef _Vector_alloc<_Vec_base_types<_Ty, _Alloc>> _Mybase;
    typedef typename _Mybase::_Alty                     _Alty;
    /*
    方便直接访问的类型别名定义
    */

    typedef _Alloc                                      allocator_type;
    typedef typename _Mybase::value_type                value_type;
    typedef typename _Mybase::size_type                 size_type;
    typedef typename _Mybase::difference_type           difference_type;
    typedef typename _Mybase::pointer                   pointer;
    typedef typename _Mybase::const_pointer             const_pointer;
    typedef typename _Mybase::reference                 reference;
    typedef typename _Mybase::const_reference           const_reference;
    /*
    接口要求的类型别名定义
    */
#define _VICONT(it)	it._Getcont()
#define _VIPTR(it)	(it)._Ptr

    typedef typename _Mybase::iterator                  iterator;
    typedef typename _Mybase::const_iterator            const_iterator;
    typedef _STD reverse_iterator<iterator>             reverse_iterator;
    typedef _STD reverse_iterator<const_iterator>       const_reverse_iterator;
    /*
    迭代器定义
    */

    vector() _NOEXCEPT
        : _Mybase()
    {
    }
    /*
    构造空迭代器
    */

    explicit vector(const _Alloc& _Al) _NOEXCEPT
        : _Mybase(_Al)
    {
    }
    /*
    用已有的allocator构造
    */

    explicit vector(size_type _Count)
        : _Mybase()
    {
        if (_Buy(_Count))
        /*
        为false的情况只有_Count == 0的情况
        */
        {
            try
            {
                _Uninitialized_default_fill_n(this->_Myfirst(), _Count, this->_Getal());
                /*
                使用默认构造填充刚分配的内存
                */
                this->_Mylast() += _Count;
            }
            catch(...)
            {
                _Tidy();
                throw;
            }
        }
    }

    vector(size_type _Count, const value_type& _Val)
        : _Mybase()
    {
        _Construct_n(_Count, _STD addressof(_Val));
    }
    vector(size_type _Count, const value_type& _Val, const _Alloc& _Al)
        : _Mybase(_Al)
    
    {
        _Construct_n(_Count, _STD addressof(_Val));
    }
    /*
    构造_Count个_Val的副本
    */

    vector(const _Myt& _Right)
        : _Mybase(_Right._Getal().select_on_container_copy_construction())
        /*
        select_on_container_copy_construction
        这个函数返回一个allocator副本,如果有;如果没有,那就返回allocator引用
        */
    {
        if (_Buy(_Right.size()))
        {
            try
            {
                this->_Mylast() = _Ucopy(_Right.begin(), _Right.end(), this->_Myfirst());
                /*
                从_Right的序列拷贝构造到新的内存
                */
            }
            catch (...)
            {
                _Tidy();
                throw;
            }
        }
    }
    vector(const _Myt& _Right, const _Alloc& _Al)
        : _Mybase(_Al)
    {
        if (_Buy(_Right.size()))
        {
            try
            {
                this->_Mylast() = _Ucopy(_Right.begin(), _Right.end(), this->_Myfirst());
            }
            catch (...)
            {
                _Tidy();
                throw;
            }
        }
    }
    /*
    没啥难理解的
    */

    template<class _Iter, class = typename enable_if<_Is_iterator<_Iter>::value, void>::type>
    vector(_Iter _First, _Iter _Last)
        : _Mybase()
    /*
    利用SFINAE,当_Iter是迭代器类型的时候使用这个函数
    */
    {
        _Construct(_First, _Last);
        /*
        直接构造
        */
    }
    template<class _Iter, class = typename enable_if<_Is_iterator<_Iter>::value, void>::type>
    vector(_Iter _First, _Iter _Last, const _Alloc& _Al)
        : _Mybase(_Al)
    {
        _Construct(_First, _Last);
    }
    /*
    同上
    */

    template<class _Iter>
    void _Construct(_Iter _First, _Iter _Last)
    {
        _Construct(_First, _Last, _Iter_cat(_First));
        /*
        _Iter_cat返回iterator的category
        */
    }
    /*
    拷贝构造的外包装
    */

    template<class _Iter>
    void _Construct(_Iter _First, _Iter _Last, input_iterator_tag)
    {
        try
        {
            for (; _First != _Last; ++_First)
            {
                emplace_back(*_First);
                /*
                输入迭代器,只能一次一次读取,并在尾部构造
                */
            }
        }
        catch(...)
        {
            _Tidy();
            throw;
        }
    }

    template<class _Iter>
    void _Construct(_Iter _First, _Iter _Last, forward_iterator_tag)
    /*
    单向迭代器
    */
    {
        if (_Buy(_STD distance(_First, _Last)))
        {
            try
            {
                this->_Mylast() = _Ucopy(_First, _Last, this->_Myfirst());
            }
            catch(...)
            {
                _Tidy();
                throw;
            }
        }
    }

    void _Construct_n(size_type _Count, const value_type *_Pval)
    {
        if (_Buy(_Count))
        {
            try
            {
                this->_Mylast() = _Ufill(this->_Myfirst(), _Count, _Pval);
                /*
                一个一个构造对象,如果抛了异常,catch之后,把已经构造的析构掉,throw
                成功后返回尾指针
                */
            }
            catch (...)
            {
                /*
                清理内存并reraise
                */
                _Tidy();
                throw;
            }
        }
    }

    vector(_Myt&& _Right) _NOEXCEPT
        : _Mybase(_STD move(_Right._Getal()))
    {	// construct by moving _Right
        _Assign_rv(_STD forward<_Myt>(_Right), true_type());
    }

    vector(_Myt&& _Right, const _Alloc& _Al)
        : _Mybase(_Al)
    {	// construct by moving _Right, allocator
        _Assign_rv(_STD forward<_Myt>(_Right));
    }

    _Myt& operator=(_Myt&& _Right)
        _NOEXCEPT_OP(_Alty::propagate_on_container_move_assignment::value
                     || _Alty::is_always_equal::value)
    {	// assign by moving _Right
        if (this != &_Right)
        {	// different, assign it
            _Tidy();
            if (_Alty::propagate_on_container_move_assignment::value
                && this->_Getal() != _Right._Getal())
                this->_Move_alloc(_Right._Getal());

            _Assign_rv(_STD forward<_Myt>(_Right));
        }
        return (*this);
    }

    void _Assign_rv(_Myt&& _Right, true_type)
    /*
    可以传递所有权
    */
    {
        this->_Swap_all((_Myt&)_Right);
        /*
        交换所有的迭代器链表
        */
        this->_Myfirst() = _Right._Myfirst();
        this->_Mylast() = _Right._Mylast();
        this->_Myend() = _Right._Myend();
        /*
        直接传递所有权
        */
        _Right._Myfirst() = pointer();
        _Right._Mylast() = pointer();
        _Right._Myend() = pointer();
    }

    void _Assign_rv(_Myt&& _Right, false_type)
    /*
    (也许)不能直接交换memory所有权的情况
    */
    {
        if (get_allocator() == _Right.get_allocator())
        {
            _Assign_rv(_STD forward<_Myt>(_Right), true_type());
            /*
            两个迭代器相同的话,也直接交换所有权
            */
        }
        else
        {
            _Construct(_STD make_move_iterator(_Right.begin()),
                       _STD make_move_iterator(_Right.end()));
            /*
            不能直接交换两块memory的所有权
            退化为拷贝构造,move_iterator对_Construct并没有卵用
            */
        }
    }

    void _Assign_rv(_Myt&& _Right)
    /*
    右值移动构造
    */
    {
        _Assign_rv(_STD forward<_Myt>(_Right),
                   typename _Alty::propagate_on_container_move_assignment());
        /*
        propagate_on_container_move_assignment
        这个tag标志memory的所有权是否可以在移动的时候被传递
        */
    }


    void push_back(value_type&& _Val)
    {
        if (_Inside(_STD addressof(_Val)))
        /*
        要push_back的元素是容器内部的
        */
        {
            size_type _Idx = _STD addressof(_Val) - this->_Myfirst();
            if (this->_Mylast() == this->_Myend())
            {
                _Reserve(1);
            }
            _Orphan_range(this->_Mylast(), this->_Mylast());
            this->_Getal().construct(this->_Mylast(),
                                     _STD forward<value_type>(this->_Myfirst()[_Idx]));
            ++this->_Mylast();
        }
        else
        {	// push back a non-element
            if (this->_Mylast() == this->_Myend())
            {
                _Reserve(1);
            }
            _Orphan_range(this->_Mylast(), this->_Mylast());
            this->_Getal().construct(this->_Mylast(),
                                     _STD forward<value_type>(_Val));
            ++this->_Mylast();
        }
    }

    iterator insert(const_iterator _Where, _Ty&& _Val)
    {
        return (emplace(_Where, _STD move(_Val)));
        /*
        通过移动构造把元素放进_Where
        */
    }

    template<class... _Valty>
    void emplace_back(_Valty&&... _Val)
    /*
    用变长参数列表在列表尾部构造
    */
    {
        if (this->_Mylast() == this->_Myend())
        {
            _Reserve(1);
        }
        _Orphan_range(this->_Mylast(), this->_Mylast());
        this->_Getal().construct(this->_Mylast(),
                                 _STD forward<_Valty>(_Val)...);
        ++this->_Mylast();
    }

    template<class... _Valty>
    iterator emplace(const_iterator _Where, _Valty&&... _Val)
    {
        size_type _Off = _VIPTR(_Where) - this->_Myfirst();

#if _ITERATOR_DEBUG_LEVEL == 2
        if (size() < _Off)
            _DEBUG_ERROR("vector emplace iterator outside range");
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */

        emplace_back(_STD forward<_Valty>(_Val)...);
        /*
        先把元素构造在末尾
        */
        _STD rotate(begin() + _Off, end() - 1, end());
        /*
        然后循环移动
        */
        return (begin() + _Off);
    }

    vector(_XSTD initializer_list<value_type> _Ilist, const _Alloc& _Al = allocator_type())
        : _Mybase(_Al)
    {
        _Construct(_Ilist.begin(), _Ilist.end());
    }
    /*
    从initializer list构造
    */

    _Myt& operator=(_XSTD initializer_list<value_type> _Ilist)
    {
        assign(_Ilist.begin(), _Ilist.end());
        return (*this);
    }
    /*
    从initlalizer list赋值
    */

    void assign(_XSTD initializer_list<value_type> _Ilist)
    {
        assign(_Ilist.begin(), _Ilist.end());
    }
    /*
    从initializer list assign
    */

    iterator insert(const_iterator _Where, _XSTD initializer_list<value_type> _Ilist)
    {
        return (insert(_Where, _Ilist.begin(), _Ilist.end()));
    }
    /*
    插入
    */

    ~vector() _NOEXCEPT
    {
        _Tidy();
    }

    _Myt& operator=(const _Myt& _Right)
    /*
    copy assignment
    */
    {
        if (this != &_Right)
        {
            if (this->_Getal() != _Right._Getal()
                && _Alty::propagate_on_container_copy_assignment::value)
            {
                _Tidy();
                this->_Copy_alloc(_Right._Getal());
            }
            /*
            如果需要
            拷贝之前先拷贝allocator
            */

            this->_Orphan_all();

            if (_Right.empty())
            {
                clear();
            }
            /*
            right为空,直接清空
            */

            else if (_Right.size() <= size())
            {
                /*
                right的有效长度<=this的有效长度
                */
                pointer _Ptr = _Copy_impl(_Right._Myfirst(),
                                          _Right._Mylast(), this->_Myfirst());
                /*
                根据各种不同的迭代器类型实现的范围拷贝
                返回已经用掉的部分的尾指针
                */
                _Destroy(_Ptr, this->_Mylast());
                /*
                析构掉从尾指针开始到last的部分
                */
                this->_Mylast() = this->_Myfirst() + _Right.size();
            }
            else if (_Right.size() <= capacity())
            {
                /*
                right的有效长度>this的有效长度,小于总容量
                */
                pointer _Ptr = _Right._Myfirst() + size();
                _Copy_impl(_Right._Myfirst(),
                           _Ptr, this->_Myfirst());
                /*
                有效长度内的,拷贝
                */
                this->_Mylast() = _Ucopy(_Ptr, _Right._Mylast(),
                                         this->_Mylast());
                /*
                有效长度外的,构造
                */
            }
            else
            {
                /*
                没有足够空间
                */
                if (this->_Myfirst() != pointer())
                {
                    _Destroy(this->_Myfirst(), this->_Mylast());
                    this->_Getal().deallocate(this->_Myfirst(), this->_Myend() - this->_Myfirst());
                    /*
                    清理掉原来的
                    */
                }
                if (_Buy(_Right.size()))
                {
                    try
                    {
                        this->_Mylast() = _Ucopy(_Right._Myfirst(), _Right._Mylast(), this->_Myfirst());
                    }
                    catch(...)
                    {
                        _Tidy();
                        throw;
                    }
                }
                /*
                照常拷贝
                */
            }
        }
        return (*this);
    }
原文地址:https://www.cnblogs.com/pointer-smq/p/5246074.html