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年都没变过,一模一样的。
那就直接来吧!(拔手榴弹)