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 倍。

相关推荐
John_ToDebug4 分钟前
chrome源码中非常巧妙、复杂或者不常见的技术手段
c++·chrome·性能优化
caoruipeng1 小时前
Windows编程----结束进程
c++·windows·子进程
请来次降维打击!!!2 小时前
算法优选系列(1.双指针_下)
c++·算法
熊峰峰2 小时前
数据结构第六节:二叉搜索树(BST)的基本操作与实现
开发语言·数据结构·c++·算法
John_ToDebug2 小时前
Chrome 浏览器性能优化全景解析
c++·chrome·性能优化
Zԅ(¯ㅂ¯ԅ)3 小时前
OpenGL中绘制图形元素的实现(使用visual studio(C++)绘制一个矩形)
c++·visual studio
维齐洛波奇特利(male)3 小时前
(语法笔记 分析题解语法 二分 “unordered_map与vector<pair<>>“ 快速数组)leetocde 1146
前端·c++·算法
小贾要学习3 小时前
【C++】string类的相关成员函数以及string的模拟实现
c语言·开发语言·c++
小小码农@3 小时前
C++跨平台开发环境搭建全指南:工具链选型与性能优化实战
开发语言·c++
牵牛老人3 小时前
C++设计模式-抽象工厂模式:从原理、适用场景、使用方法,常见问题和解决方案深度解析
c++·设计模式·抽象工厂模式