STL::vector 探索

成员变量
_MyFirst
_MyLast
_MyEnd

底层函数
bool _Buy(size_type _Capacity) 开辟一段内部存储空间
void _Destroy(pointer _First, pointer _Last) 对这些元素做析构操作 (或什么也不干)
void _Tidy() 销毁内部存储空间 (包括对内部元素的析构操作)

_OutIt unchecked_copy(_InIt _First, _InIt _Last, _OutIt _Dest) 拷贝元素(_Dest中的元素已初始化,这里对_Dest中的每个元素调用 = 操作)
pointer _Ucopy(_Iter _First, _Iter _Last, pointer _Ptr) 拷贝元素(_Dest中的元素未初始化,这里对_Dest中的每个元素调用拷贝构造函数)
pointer _Umove(_Iter _First, _Iter _Last, pointer _Ptr) 移动元素(_Dest中的元素未初始化,直接调用 memcpy 拷贝内存)
pointer _Ufill(pointer _Ptr, size_type _Count, const _Ty &_Val) 给元素赋值 (_Dest中的元素未初始化,对_Dest中的每个元素调用拷贝构造函数)
void fill(_FwdIt _First, _FwdIt _Last, const _Ty& _Val) 给元素赋值 (_Dest中的元素已初始化,对_Dest中的每个元素调用 = 操作)

中间函数
void _Construct_n(size_type _Count, const _Ty& _Val) 开辟 _Count 空间并用 _Val 初始化
void _Insert(iterator _Where, _Iter _First, _Iter _Last, forward_iterator_tag) 内部存储空间的扩展代码在这,每次扩大50%
void _Insert_n(iterator _Where, size_type _Count, const _Ty& _Val)
iterator erase(iterator _First, iterator _Last)

对外接口
size_type capacity() _Myend - _Myfirst
size_type size()  _Mylast - _Myfirst


几个关键函数简化
template
        void _Insert(iterator _Where,
            _Iter _First, _Iter _Last, forward_iterator_tag)
        {    // insert [_First, _Last) at _Where, forward iterators
        size_type _Count = _Last - _First;
        size_type _Capacity = capacity();

        if (_Count == 0)
            ;
        else if (_Capacity < size() + _Count)
        {    // not enough room, reallocate
            _Capacity = max_size() - _Capacity / 2 < _Capacity
                ? 0 : _Capacity + _Capacity / 2;    // try to grow by 50%
            if (_Capacity < size() + _Count)
                _Capacity = size() + _Count;
            _Ty * _Newvec = (_Ty *)::operator new(_Count * sizeof (_Ty));
            _Ty * _Ptr = _Newvec;

            _Ptr = _Umove(_Myfirst, _Where, _Newvec);    // copy prefix
            _Ptr = _Ucopy(_First, _Last, _Ptr);    // add new stuff
            _Umove(_Where, _Mylast, _Ptr);    // copy suffix

            _Count += size();
            if (_Myfirst != 0)
            {
                ::operator delete (_Myfirst);
            }

            _Myend = _Newvec + _Capacity;
            _Mylast = _Newvec + _Count;
            _Myfirst = _Newvec;
        }
        else if ((size_type)(end() - _Where) < _Count)
        {    // new stuff spills off end
            _Umove(_Where, _Mylast, _Where + _Count);    // copy suffix
            _Iter _Mid = _First;
            advance(_Mid, end() - _Where);
            _Ucopy(_Mid, _Last, _Mylast);    // insert new stuff off end

            _Mylast += _Count;

            unchecked_copy(_First, _Mid, _Where);    // insert to old end
            }
        else
            {    // new stuff can all be assigned
            pointer _Oldend = _Mylast;
            _Mylast = _Umove(_Oldend - _Count, _Oldend, _Mylast);    // copy suffix
            _Unchecked_move_backward(_Where, _Oldend - _Count, _Oldend);    // copy hole

            unchecked_copy(_First, _Last, _Where);    // insert into hole
            }
        }

这个 Insert 函数分了几种情况处理
1. _Capacity < size() + _Count ,这时需要扩大存储空间了,每次扩大50%,然后移动内容
1) 移动 [_MyFirst, _Where) 到新数组
2) 拷贝 [_First, _Last)
3) 移动 [_Where, _MyLast)

原存储空间:


新存储空间:
 

2. size() + _Count < _Capacity && end() < _Where + _Count, 也就是插入的内容超出了 _MyLast.
1) 移动 [_Where, _MyLast) 到 [size() + _Count, ...)
2) 拷贝 [_Mid, _Last) 到 [size(), ...)   //目的空间未初始化
3) 拷贝 [_First, _Mid) 到 [_Where, ...)//目的空间已初始化

原存储空间:

新存储空间:

3.剩余情况
1)移动 [_Where, _MyLast) 到 [_Where + _Count, ...) //分了两步
2) 拷贝 [_First, _Last)

原存储空间:
新存储空间:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值