STL 版本
vs STL windows平台 vs编译器实现的版本
SGI STL 是gcc默认版本最有 权威的
STL port 效率最高的
源码的命名方式
_MyBase() 非标准接口 只在内部使用
vecor()非_的名称 标准接口 暴露出去 STL 的标准
知识点
typedef typename _Alty<_Ty> _Alty1; //typename 必须要加 加了之后 是_Ty模板
typedef _Alty<_Ty> _Alty1; // 是一个静态的 认为类型就是 _Ty 不会替换
template<typeanme ... _Other2> //...表示多个
vs2013下
#include <vector>
int main()
{
std::vector<int> nVec;
return 0;
}
断点调试 F11 皮皮虾我们走!
进入到 vector默认构造函数
vector()
: _Mybase()
{ // construct empty vector
}
天啊撸 什么都没做 继承了类 Mybase继承 F12看一下 MyBase
typedef _Vector_alloc<!is_empty<_Alloc>::value,
_Vec_base_types<_Ty, _Alloc> > _Mybase;
是一个 模板类 _Vector_alloc 的别名 看全面一点
template<class _Ty,
class _Alloc = allocator<_Ty> >
class vector
: public _Vector_alloc<!is_empty<_Alloc>::value,
_Vec_base_types<_Ty, _Alloc> >
看到了 vecor 类模板全套 卧槽命名有点小恶心。 修改一下
template<typename _Ty, typename _Alloc = allocator<_Ty> >
class vector: public _Vector_alloc<!is_empty<_Alloc>::value,
_Vec_base_types<_Ty, _Alloc> >
还是看不懂 一点点的 分析 vecor<int> 做一个替换
template<typename int, typename _Alloc = allocator<int> >
class vector: public _Vector_alloc<!is_empty<_Alloc>::value,
_Vec_base_types<int, _Alloc> >
allocator<int> 是一个分配器 主要操作就是 分配内存指针
!is_empty<_Alloc>::value 顾名思义 是否为空
_Vec_base_types<int, _Alloc> 这个鬼全是 一些 别名。。。。。神经病啊!
继续解析 _Vector_alloc
template<class _Alloc_types>
class _Vector_alloc<false, _Alloc_types>
: public _Vector_val<typename _Alloc_types::_Val_types>
有继承了一个 _Vector_val 的类
点进去 看到
class _Vector_val
: public _Container_base
又是一个继承 我只能说 贵圈真乱、、、
_Container_base 是一个容器的结构体
核心的一个类
_Vector_val
template<class _Val_types>
class _Vector_val
: public _Container_base
{ // base class for vector to hold data
public:
typedef _Vector_val<_Val_types> _Myt;
//下面的这几个是 STL标准接口 必须实现
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()
{ // initialize values
_Myfirst = pointer();
_Mylast = pointer();
_Myend = pointer();
}
pointer _Myfirst; // 指针数组的开始
pointer _Mylast; // 指针数组用了多少
pointer _Myend; // 指针数组最大值
};
总结一下思路 调用 vector 然后 会调用父类 _Vector_alloc 分配器 分配 分配器会有使用 _Vector_val 构造 _Myfirst _Mylast _Myend 然后构造完成一个空的 vector ---看vs 的源码感觉自己已经疯了。。。 = =