/explicit 防止隐式类型转换。并且在参数中拿到一个分配器,用VectorBase里面的分配器来初始化他。
//这里调用的Vector里面的默认构造函数。
explicit vector(const allocator_type& __a = allocator_type())
: _Base(__a) {}
//传递进来的是有长度,并且有类型的话,就会调用VectorBase里面指定长度初始化的构造函数。
//依然是用Base里面的分配器来分配。
vector(size_type __n, const _Tp& __value,
const allocator_type& __a = allocator_type())
: _Base(__n, __a)
{
_M_finish = uninitialized_fill_n(_M_start, __n, __value);//这个底层实现就调用了个fill_n
/*fill_n 从_M_start 开始填充值,填充_n个,_value的值。*/
}
//如果传递进来的只有长度而类型对象已经初始化好了的话
//就直接调用已经分配好了的对象。
explicit vector(size_type __n)
: _Base(__n, allocator_type())
{
_M_finish = uninitialized_fill_n(_M_start, __n, _Tp());
//从_M_start开始填充__n个,_Tp()对象。
}
//这是在一个Vector里面放入了另外一个Vector。
//比如在Vector1中放入Vector2,Vector2的大小是size()算法提供的长度,还是由Base里面来提供分配器。
vector(const vector<_Tp, _Alloc>& __x)
: _Base(__x.size(), __x.get_allocator())
{
_M_finish = uninitialized_copy(__x.begin(), __x.end(), _M_start);//底层调用了一个Copy()算法
//将__x.begin()到__x.end()的值Copy到_M_start 指针的位置。
}
SGI STL 源码分析(四)Vector构造的过程
最新推荐文章于 2020-08-17 14:00:13 发布