总体策略
在vidual stdio 2022的编译器中,vector增长的方式可以分为两种情况:
- 调用reserve(n),且 n > capacity:vector的capacity增长为n;
- 使用非reserve来增长vector,比如 push_back() 以及 resize() 函数,并触发了更大内存空间的申请:设申请的大小为n (n > capacity),则内存分配结果是:capacity = n > (capacity + capacity / 2) ? n : (capacity + capacity / 2) 。
测试
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> a(5);
cout << "初始化的cap: \t\t" << a.capacity() << endl;
a.push_back(3);
cout << "push_back之后的cap:\t" << a.capacity() << endl;
a.resize(12);
cout << "resize之后的cap:\t" << a.capacity() << endl;
a.reserve(15);
cout << "reserve之后的cap:\t" << a.capacity() << endl;
return 0;
}
输出:
初始化的cap: 5
push_back之后的cap: 7 (增加了5/2)
resize之后的cap: 12 (12 比 7+7/2=10 大)
reserve之后的cap: 15 (15 比 12 大)
resize(n, val)
- 当 n < size 时,把多余的元素删除,capacity不变
- 当 size < n < capacity时,把添加的元素初始化为val(否则为0),capcity不变
- 当 capacity < n < capacity + capacity / 2 时,capacity增长到 capacity + capacity / 2, 且多出来的元素初始化为val。
push_back(val)
capacity 增长到 capacity + capacity / 2
reserve(n)
- 当 n <= capacity 时,什么都不做
- 当 n > capacity时,capacity增长到n