码迷,mamicode.com
首页 > 其他好文 > 详细

STL vector的N种构造方式

时间:2015-07-25 23:04:09      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:stl   vector   

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小于源目标时)





版权声明:本文为博主原创文章,未经博主允许不得转载。

STL vector的N种构造方式

标签:stl   vector   

原文地址:http://blog.csdn.net/xi_niuniu/article/details/47060043

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!