第一次尝试看看源码
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,鼓励大家遵循相同的政策。