vector数组

vector扩大容量的本质
当 vector 的大小和容量相等(size==capacity)也就是满载时,如果再向其添加元素,那么 vector 就需要扩容。vector 容器扩容的过程需要经历以下 3 步:1. 完全弃用现有的内存空间,重新申请更大的内存空间;2. 将旧内存空间中的数据,按原有顺序移动到新的内存空间中;3. 最后将旧的内存空间释放。

由于vector 容器在进行扩容后,内存空间可能位置发生改变,因此与其相关的指针、引用以及迭代器可能会失效。vector 中存储的内容默认是在堆中分配的,旦可以指定自己的空间配置器来改变这种行为。栈的空间也是可以动态分配的,但不是 C++ 的标准,VC 做了扩展后可以的。C99 的可变数组就是动态在栈中分配空间的。

cvector维护的是一个连续线性空间,所以支持vector随机存取。

1. resize()

resize()扩容的默认构造的方式是0, 之后插入按照1, 2, 4, 8, 16 二倍扩容。注(GCC是二倍扩容,VS13是1.5倍扩容。主要为了避免频繁的分配内存,C++每次申请内存都会成倍的增长)
扩容后是一片新的内存,需要把旧内存空间中的所有元素都拷贝进新内存空间中去,之后再在新内存空间中的原数据的后面继续进行插入构造新元素,并且同时释放旧内存空间,并且,由于vector 空间的重新配置,导致旧vector的所有迭代器都失效了。
resize()函数和容器的size息息相关。调用resize(n)后,容器的size即为n。至于是否影响capacity,取决于调整后的容器的size是否大于capacity。resize会有默认填充(初始化)操作。

vector<int> value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };
cout << "value 容量是:" << value.capacity() << endl; //15
value.resize(5);
cout << "value 大小是:" << value.size() << endl; // 5
// reseize(5) 调整大小为5,小于实际容量,不需要创建新内存空间
cout << "value 容量是:" << value.capacity() << endl; // 15

2. reserve()

reserve只是保证vector的空间大小(_capacity)最少达到它的参数所指定的大小n。在区间[0, n)范围内,预留了内存但是并未初始化;
只有当所申请的容量大于vector的当前容量capacity时才会重新为vector分配存储空间;小于当前容量则没有影响;

value.reserve(10); // 10<15 无影响
cout << "value 大小是:" << value.size() << endl; // 5
cout << "value 容量是:" << value.capacity() << endl; // 15
value.reserve(50); // 50>15扩容
cout << "value 大小是:" << value.size() << endl; // 5
cout << "value 容量是:" << value.capacity() << endl; // 50

reserve方法对于vector元素大小没有任何影响,不创建对象。
reserve()函数和容器的capacity息息相关。 调用reserve(n)后,若容器的capacity < n,则重新分配内存空间,从而使得capacity等于n。 如果capacity>=n,capacity无变化。

3. size()和capacity()

vector 容器的容量(用 capacity 表示),指的是在不分配更多内存的情况下,容器可以保存的最多元素个数;而 vector 容器的大小(用 size 表示),指的是它实际所包含的元素个数。

vector<int> value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 };
value.reserve(20); // 重新(预留)分配空间
cout << "value 容量是:" << value.capacity() << endl; // 20
cout << "value 大小是:" << value.size() << endl;       // 15

显然,vector 容器的大小不能超出它的容量,在大小等于容量的基础上,只要增加一个元素,就必须分配更多的内存。注意,这里的“更多”并不是 1 个。换句话说,当vector容器的大小和容量相等时,如果再向其添加(或者插入)一个元素,vector往往会申请多个存储空间,而不仅仅只申请 1 个。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值