vector

vector容器

此节大概讲述一下VS STL的vector容器,对几个函数进行解析以及内部实现进行了解以下。

打开vector你会看到vector模板类真正含有的东西只有一个_Compressed_pair<_Alty, _Scary_val> _Mypair

_Mypair内部最重要的就是_Scary_val,它是一个别名,具体声明如下。

using 
    _Scary_val = _Vector_val<
                    conditional_t<
                        _Is_simple_alloc_v<_Alty>,
                        _Simple_types<_Ty>,
                        _Vec_iter_types<
                            _Ty, 
                            size_type, 
                            difference_type, 
                            pointer, 
                            const_pointer,
                            _Ty&, 
                            const _Ty&>
                    >
                 >;

这个东西可有点长,简单点说,你可以就取前面的_Vector_val,如果你想要详细的解释的话……

_Vector_val中的conditional_t用来类型判断,它会根据第一个参数的true或false,也就是_Is_simple_alloc_v<_Alty>_的真值来选择后面两个类型的其中一个——是内置的int或double这样的类型,还是vector的类型。

比如说你定义了一个vector<vector<int>>,那么对于外面的vector来说,他的包含类型是vector<int>,而里面的就是int,这个判断过程就是利用模板参数自动判断类型的。

好了现在我们拿到了整个vector的类型,然后把他当作参数传给_Vector_val。而在_Vector_val里面有三个指针,这个指针的类型就是由刚才判断出来的类型定义的。

pointer _Myfirst;
pointer _Mylast;
pointer _Myend;

这三个指针就负责整个vector的大小指示。

请看:

_NODISCARD _CONSTEXPR20 size_type size() const noexcept {
   
    auto& _My_data = _Mypair._Myval2;
    return static_cast<size_type>(_My_data._Mylast - _My_data._Myfirst);
}

vector的size()内部就是用last指针减掉first指针算的,那么由此你也能想到capacity是怎么算得了。

_NODISCARD _CONSTEXPR20 size_type capacity() const noexcept {
   
    auto& _My_data = _Mypair._Myval2;
    return static_cast<size_type>(_My_data._Myend - _My_data._Myfirst);
}

由此,三个指针指出了vector的大小和容量。begin和end其实就是用这几个指针构造一个iterator出来然后返回(pass by value)。


容器函数

接下来我们讲解一个比较重要的函数,由此探究vector内部的细节。

insert

看过STL源码剖析的人可以不用看了,这东西20年都没变过,一模一样的。

那就直接来吧!(拔手榴弹)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值