C/C++培训
达内IT学院
400-996-5531
Vector是一种顺序存储的容器结构。他的底层是通过数组来实现的。
(1) 在容器对象中insert或压入一个元素时,该对象的大小增加1 。如果resize容器以扩充其容量,则必须在容器中添加额外的元素。为了支持快速的随机访问,vector容器的元素以连续的方式存放—-每一个元素都紧挨着前一个元素存储。
(2) 已知元素是连续存储的,当我们在容器内添加一个元素时,如果容器中已经没有空间容纳新的元素,此时,由于元素必须连续存储以便索引访问,所以不能在内存中随便找个地方存储这个新元素。于是,vector必须重新分配存储空间,用来存放原来的元素以及新添加的元素:存放在旧存储空间中的元素被复制到新存储空间里, 接着插入新元素,最后撤销旧的存储空间。
新存储空间的大小因编译器的的不同而不同(有的是原容量的2倍,有的是原容的3/2)。
(3) vector实现内存分配用到的——-capacity 和 reserve成员
vector类提供了两个成员函数:capacity 和 reserve。 size 指容器当前拥有的元素个数,而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。
reserve函数的功能是设置预留多大的内存空间
vector<int> ivec;
cout<<"ivec:size:"<<ivec.size()
<<"capacity:"<<ivec.capacity()<<endl;
for(vector<int>::size_typeix=0;ix!=24;ix++)
{
ivec.push_back(ix);
}
//size 是24,capacity大于24
cout<<"ivec:size:"<<ivec.size()
<<"capacity:"<<ivec.capacity()<<endl;
// 结果:
// 0 0
// 24 32(必须大于size的一个随机内存大小)
空的vector容器的size是0,其capacity也为0.
当程序员在vector中插入元素时,容器的size就是所添加元素的个数,capacity则必须至少等于size,但通常大于size。
在上述程序中,一次添加一个元素,共添加24个元素,结果其capacity为32 . ivec容器当前状态如下图所示:
//设置预留额外的存储空间
ivec.reserve(50);//设置预留空间至少50
cout<<"ivec:size:"<<ivec.size()
<<"capacity:"<<ivec.capacity()<<endl;
//结果: 24 50
//size大小不变
while(ivec.size()!=ivec.capacity())
ivec.push_back(0);
cout<<"ivec:size:"<<ivec.size()
<<"capacity:"<<ivec.capacity()<<endl;
//结果:
//50 50
//因为使用的是预留的容量,所以vector不必做任何的内存分配工作,事实上,只要还有剩余的容量,vector就不必为其元素重新分配存储空间
因为使用的是预留的容量,所以vector不必做任何的内存分配工作,事实上,只要还有剩余的容量,vector就不必为其元素重新分配存储空间
从上述程序可以看出,我们已经耗尽了预留的容量因为 size与capacity值相等。此时,如果要再添加新的元素,vector必须为自己重新分配存储空间。一种策略是重新分配的容量的增幅为原容量的1/2,即等于3/2原容量。还有策略就是在原来容量基础上加倍
ivec.push_back(42);//之前分配的所有空间已经耗尽了,此时再添加一个新的元素。
cout<<"ivec:size:"<<ivec.size()
<<"capacity:"<<ivec.capacity()<<endl;
//结果
// 51 100
//添加新的元素,vector必须为自己重新分配存储空间,重新分配的容量大小加倍当前容量
填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved