一、vector的特点
- 动态性,空间大小既可以增大亦可以减少;
- 连续性,vector元素序列在空间地址是连续分布的;
- 稳定性,vector元素序列在空间地址是相对固定的。
vector常常被称为动态数组,这里的“动”应该相对于内置数组中的“静”,声明一个内置数组意味着最大容量已经确定,反之,动态数组则可以根据用户的需要进行调整。
1.2 vector的连续性vector的元素序列存储是一段连续的内存区间,内存区间的划取由编译器决定,vector所能容纳的最大元素个数称之为容量(capacity),目前已经存放的元素个数为(size),构造一个vector对象时capacity=size,在添加一个元素后,存在size>capacity,此时必须增加capacity++,同时编译器必须重新分配内存并将原有数据拷贝至新的内存空间,最后写入新的元素。可见按照一次增加一个capacity的方法需要三步:
- 重新划分内存
- 复制原有元素个数
- 写入新的数据
如果程序再次增加一个元素,需要重新经过上述三个步骤,性能将会慢到不可接受[1]
1.3 vector的稳定性为了提高性能,空间换取时间是一个解决方法。即每一次分配一个比新的空间更大的内存空间,通常的策略是分配一个比capacity=2size,或capacity=1.5size[2]。此时vector将会有一定的capacity的稳定性,他的代价是占用了大于size的capacity空间。当然在你也可以手动回收和设置分配策略,其方法是通过下面两个方法:
- shrink_to_fit() 尝试回收尚未使用的capacity空间
- reserve(n) 显式告知编译器需要的capacity空间大小
另,我们可以通过调用capacity(),查看capacity空间大小。
小结:- vector的三个特点:动态、连续和稳定性
- vector通常会分配比实际size更大的capacity以减少内存操作,这是一种空间换取时间的思想
- vector在C++11下可以通过shrink_to_fit来回收多余空间,reserve控制capacity大小
[1] C++ primer 5th P317 [2] 取决于编译器具体的实现