C/C++培训
美国上市C/C++培训机构

400-111-8989

热门课程

C++程序员面试题-Vector的自增长

  • 时间:2017-10-20
  • 发布:C++培训
  • 来源:C++职场

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必须为自己重新分配存储空间,重新分配的容量大小加倍当前容量

上一篇:C++后台开发需要掌握哪些技术?
下一篇:c++程序员面试 - 二叉平衡树的插入

做C++开发是否面临职业生涯短暂的问题?

常见的十道C/C++程序员面试题

c语言面试题----指针篇

C/C++常见面试题整理

选择城市和中心
贵州省

广西省

海南省