1 使用默认无参的构造函数进行构造
vector<int> intVect;
观察内存可以看到生成一个带有0个元素的vector时内存中_Myfirst _Mylast _Myend的值均为0,说明vector对象并没有在堆中分配任何存储空间,仅仅是在栈中分配了16字节存储vecotr对象元素,在这16字节中前4字节如果没猜错,应该是一个虚表指针。
Vecotr模版类有三个成员变量
_Myfirst 记录在堆分配数组的首地址
_Mylast 记录在堆中分配数组中最后一个有效数据的下一字节地址(不包含有效数据)
_Myend 记录在椎中分配数组末尾元素的下一字节地址(已经超出数组寻址有效范围)
2 使用带一个参数构造的vector对象
vector<int> intVec(5);
Vector构造对象时只有一个参数时
1:分配的堆内存空间会默认全部初始化为0,
2数组空间大小为 参数 * sizeof(元素类型) , 参数指定元素的个数
3使用带两个参数构造的vector对象
1) 第一个参数:指定元素的个数(数组大小)
2) 第二个参数:数组元素全部初始化为第二个参数的值
4 构造元素为自定义类型的vector
同基本数组类型vecotr的构造相似
1) 第一个参数:指定元素的个数(数组大小)
2) 第二个参数:数组元素全部初始化为第二个参数的值
5. C11中新加的构造方式,构造函数接受一个initialize_list参数
通过initialize_list列表中所给的数值以及数值个数分配空间
6 在堆中构造vector
在堆中生成一个vector对象,并返回vector对象在堆中的首地址赋值给一个在栈中指向vector类型的指针
注意使用new分配的vector 要使用 delete 释放 delete pIntVec
7 vector的拷贝构造
vector<int>
intVec1 = { 1, 2, 3 };
vector<int>
intVec2(intVec1);
Vector的拷贝构造是一个深拷贝,intVec2分配了同intVec1同样大小的内存空间,并把intVec1中的数值拷贝了过来
8 vector的复制运算符重载
在调用赋值运算符之前
调用赋值运算符之后
可以看到intVec2把intVec1中的有效数值全部复制了过来,那么在两个vector大小不同志的情况下又会是什么样呢?
当intvec2.capacity()> intVec2.capacity()时
调用赋值运算符之前
调用赋值运算符后
IntVec2的容量大于intVec1的容量,所以可以直接把intVec1中的数据全部复制过来,而没有必要重新分配空间再复制,提高程序性能。
_Myfirst 记录在堆中分配数组的首地址
_Mylast 记录在堆中分配数组中最后一个有效数据的下一字节地址(不包含有效数据)
_Myend 记录在椎中分配数组末尾元素的下一字节地址(已经超出数组寻址有效范围)
仔细观察会发现intVec2中的成员变量_Mylast成员变量发生了变化,因为当执行
intVec2 = intVec1 这条语句后,intVec2的状态和行为就和intVec1几无区别,此时虽然intVec2还有两个int内存空间,正是由于_Mylast作为限制,才得以使此时的intVec2的状态和行为与IntVec1相同。 也说明任何一个vector对象的数据都只有在 [_Myfirst,_Mylast) 之间才有效,不包括_Mylast
当intvec2.size()< intVec2.size()时
调用赋值运算符之前
调用赋值运算符后
当赋值运算符左边的vector对象的capacity小于右边vector对象的capacity时,左边vector对象会释放原来的空间,按运算符右边vector对象的capacity大小重新分配一块新内存空间,并把源vecotr对象的数据复制到新空间中。Vector的赋值运算同样是深拷贝(仅当capacity小于源目标时)
版权声明:本文为博主原创文章,未经博主允许不得转载。