VS2010下 STL源码剖析1:vector1——capacity扩容代码、vector动态数组内部实现连续空间

第一次尝试看看源码

vector的定义:typedef vector<_Ty, _Ax> _Myt;默认是两个参数,第二个参数有默认值
在这里插入图片描述
allocator本身是一个类模板,是内存分配子,stl为分配一个默认的内存分配子allocator<_Ty>

调用基类的构造函数
在这里插入图片描述
typedef _Vector_val<_Ty, _Ax> _Mybase;
哇这个allocator往回跳往回跳好复杂,基类的基类的基类也号复杂啧啧啧,等之后再回构造器吧
===》直接到基类构造完,开始vector,vector一般就是这么创建的vector<int> v;,没有对象成员要构造👇
vector基类有一个内存分配子

vector内部有三个指针:

在这里插入图片描述
begin(), end(),左闭右开,
在这里插入图片描述
一开始三个指针都设置为空指针,后根据capacity赋值

_Myfirst = this->_Alval.allocate(_Capacity);
_Mylast = _Myfirst;
_Myend = _Myfirst + _Capacity;

关于capacity

capacity()是内部能够容纳的元素个数
size()是内部所存放的元素个数

通常,vector缓存了一部分内存空间,用来容纳更多的元素,这样,下一次插入新元素的时候,就不必分配内存,就提高插入速度

依次输入7个数,打印每一次的capacity,结果:1 2 3 4 6 6 9,而每次元素实际存放个数为 1 2 3 4 5 6 7,得出结论:每次增长原来的一半,x+=x/2
扩展:codeblock是成倍增长的,不同的编译器有不同的扩容算法

在这里插入图片描述
在这里插入图片描述
👇
在这里插入图片描述👇

在这里插入图片描述👇

在这里插入图片描述第一次分配1个空间


vector动态数组内部实现连续空间

先分配空间,将当前要插入的数字先放入新空间中,再将原来的复制过去

push_back的工作原理

下篇


散装知识点xX:

explicit关键字只需用于类内的单参数构造函数前面。由于无参数的构造函数和多参数的构造函数总是显示调用,这种情况在构造函数前加explicit无意义。

google的c++规范中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。所以google约定所有单参数的构造函数都必须是显示的,只有极少数情况下拷贝构造函数可以不声明称explicit。例如作为其他类的透明包装器的类。
  effective c++中说:被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎。因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。除非我有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit,鼓励大家遵循相同的政策。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值