在对 vector 容器 push_back 操作时,其capacity 会以怎样的大小进行扩容呢?
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <string>
int main()
{
std::vector<std::string> stringVec;
printf("1, capacity of stringVec is %u\n", stringVec.capacity());
stringVec.push_back("11");
stringVec.push_back("22");
printf("2, capacity of stringVec is %u\n", stringVec.capacity());
stringVec.push_back("33");
printf("3, capacity of stringVec is %u\n", stringVec.capacity());
stringVec.push_back("44");
return 0;
}
可以看出在容器空时其 capacity 的大小为0,此时容器内并没有元素;在 push_back 2次后,其 capacity 的大小为 2;再 push_back 一次时,此时容器当中应该有 3 个元素,而 capacity 的大小为 4,可以看出 vector 的 capacity 的每次增长是当前大小的 2 倍。结合源码看一下:
容量不够时,扩容
最关键的就是要申请的大小 __len 的值是多少?用 GDB 跟踪一下可以看到其大小:
其求值是这句 const size_type __len = size() + std::max(size(), __n); size() 取的是当前元素的个数,而入参 __n = 1, 所以 __len = size() + size(),这不就是 2 个 size() 吗?不过如果是首次 push_back 的话,__len = 1,因为此时 size() = 0。可以验证一下:
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <string>
int main()
{
printf("__cplusplus = %d\n", __cplusplus);
std::vector<std::string> stringVec;
printf("1, capacity of stringVec is %u\n", stringVec.capacity());
stringVec.push_back("11");
printf("2, capacity of stringVec is %u\n", stringVec.capacity());
stringVec.push_back("22");
printf("3, capacity of stringVec is %u\n", stringVec.capacity());
stringVec.push_back("33");
printf("4, capacity of stringVec is %u\n", stringVec.capacity());
stringVec.push_back("44");
return 0;
}
首次 push_back 后 vecotr 的 capacity = 1,之后的增长则是为当前 size() 的 2 倍。