vector的底层内存模型就是一个数组,但vector的容量却是可以动态增长的。
当插入新的元素内存不够时,会自动扩容,不同的编译器扩容的倍数也不一样,Linux下通常为原容量的两倍。扩容之后将原来的元素拷贝到新的内存空间上,然后把原来的内存空间释放掉。
size 和 capacity
- size代表当前容器内元素的个数。
- capacity表示容器可以容纳的元素个数。这个数必然大于等于size,如果新插入元素的时候size等于capacity,说明已经没有额外空间来存储元素了,就需要扩容。
默认的扩容时机
以下示例在ubuntu 2204上测试
容器初始化为空
std::vector<int> v0;
std::cout << "v0 capacity 0: " << v0.capacity() << ", size " << v0.size()
<< std::endl;
for (int i = 1; i <= 130; ++i) {
v0.push_back(i);
std::cout << "v0 capacity " << i << ": " << v0.capacity() << ", size "
<< v0.size() << std::endl;
}
v0 capacity 0: 0, size 0
v0 capacity 1: 1, size 1
v0 capacity 2: 2, size 2
v0 capacity 3: 4, size 3
v0 capacity 4: 4, size 4
v0 capacity 5: 8, size 5
v0 capacity 8: 8, size 8
v0 capacity 9: 16, size 9
...
v0 capacity 16: 16, size 16
v0 capacity 17: 32, size 17
...
v0 capacity 32: 32, size 32
v0 capacity 33: 64, size 33
...
v0 capacity 64: 64, size 64
v0 capacity 65: 128, size 65
...
v0 capacity 128: 128, size 1