更多课程 选择中心

C/C++培训
达内IT学院

400-111-8989

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

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

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++后台开发面试难不难,来看看京东

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省