vector 的 capacity 增长

在对 vector 容器 push_back 操作时,其capacity 会以怎样的大小进行扩容呢?

cpp 复制代码
#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。可以验证一下:

cpp 复制代码
#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 倍。

相关推荐
从零开始的代码生活_37 分钟前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸41 分钟前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
GIS阵地1 小时前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis
王维同学2 小时前
[原创][Windows C++]LSA 认证、安全与通知包的注册表枚举
c++·windows·安全
_wyt0013 小时前
完全背包问题详解
c++·背包dp
皓月斯语4 小时前
B3842 [GESP202306 三级] 春游 题解
数据结构·c++·算法·题解
CedarQR5 小时前
万字长文:从零在 RK3588 上部署 PaddleSpeech 中文 TTS 全流程(FastSpeech2 + HiFiGAN)
开发语言·c++·嵌入式硬件·ubuntu·json
萌动的小火苗6 小时前
嵌入式开发中的栈与队列:任务调度为什么依赖数据结构
数据结构·c++·单片机·嵌入式硬件
星恒随风6 小时前
C++ STL 栈详解:stack 的使用、经典题目与简单模拟实现
开发语言·数据结构·c++·笔记·学习
txzrxz6 小时前
单调队列讲解
数据结构·c++·算法·单调队列