讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ STL容器容量和大小有什么区别 解释capacity和size的不同含义

秋婷君_1211

秋婷君_1211

发布时间:2025-08-12 15:44:01

|

921人浏览过

|

来源于php中文网

原创

在c++ stl中,size()表示当前容器实际存储的元素数量,而capacity()表示容器在不重新分配内存的情况下最多可以容纳的元素数量。1. size()反映“实际使用量”,如vector添加3个元素则size为3;2. capacity()反映“最大可用量”,如预留10个空间但未使用则容量为10;3. 容量通常大于等于大小,当超过容量时会扩容,如vector从2扩到4;4. 可通过reserve()预分配空间,shrink_to_fit()释放多余空间,但非强制生效;5. 链式容器如list没有capacity(),因其每次插入单独分配内存。理解这两个属性有助于优化性能和内存管理,尤其在处理大量数据时更为关键。

C++ STL容器容量和大小有什么区别 解释capacity和size的不同含义

在C++ STL中,容器的

capacity
和
size
是两个经常被混淆的概念。简单来说,
size()
表示当前容器中有多少个元素,而
capacity()
表示容器在不重新分配内存的情况下最多可以容纳多少元素
。理解这两个概念的区别对优化性能、减少不必要的内存操作非常重要。

C++ STL容器容量和大小有什么区别 解释capacity和size的不同含义

size():你用了多少空间?

size()
返回的是容器当前实际存储的元素数量。比如你有一个
vector<int>
,往里面添加了5个整数,那么它的
size()
就是5。

C++ STL容器容量和大小有什么区别 解释capacity和size的不同含义
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);

std::cout << "Size: " << v.size(); // 输出 3

无论你预先预留了多少空间,只要没真正添加元素,

size()
就不会增加。它反映的是“实际使用量”。

立即学习“C++免费学习笔记(深入)”;


capacity():你能用多少空间?

capacity()
表示当前容器内部已经分配的内存能容纳多少元素。这个值通常大于或等于
size()
,因为容器为了提升效率,会在扩容时一次性多分配一些空间。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
C++ STL容器容量和大小有什么区别 解释capacity和size的不同含义

例如:

std::vector<int> v;
v.reserve(10); // 预留10个int的空间

std::cout << "Size: " << v.size();     // 输出 0
std::cout << "Capacity: " << v.capacity(); // 输出 10

这里虽然容量是10,但实际只用了0个,说明

capacity()
反映的是“最大可用量”。


容量和大小的变化规律

  • 当向容器添加元素超过当前容量时,会触发重新分配内存(reallocate),容量通常会翻倍或其他策略增长。
  • 调用 reserve() 或 shrink_to_fit() 可以主动控制容量,但不会影响
    size()
    。
  • 对于某些容器如
    list
    、
    forward_list
    、
    map
    等,没有
    capacity()
    方法,因为它们是链式结构,每次插入都单独分配内存。

举个例子说明扩容过程:

std::vector<int> v;

// 初始状态
std::cout << v.size() << " / " << v.capacity() << std::endl; // 0 / 0

v.push_back(1);
std::cout << v.size() << " / " << v.capacity() << std::endl; // 1 / 1

v.push_back(2);
std::cout << v.size() << " / " << v.capacity() << std::endl; // 2 / 2

v.push_back(3);
std::cout << v.size() << " / " << v.capacity() << std::endl; // 3 / 4

可以看到,当第三个元素加入后,容量从2变成了4,这是因为底层机制决定要扩展内存。


实际应用中的建议

  • 如果你知道容器最终会有多大,提前调用
    reserve()
    可以避免多次扩容带来的性能开销。
  • 不需要频繁关注
    capacity()
    ,除非你在处理大量数据或性能敏感的场景。
  • 使用
    shrink_to_fit()
    可以让容器释放多余的空间,但不是强制的(是否生效取决于实现)。

常见做法包括:

  • 在循环前预分配足够空间:
    vec.reserve(N);
  • 大量删除元素后回收空间:
    vec.shrink_to_fit();
  • 检查容量变化来调试性能问题

基本上就这些。

size()
和
capacity()
的区别看起来不大,但在写高性能代码时却很关键,特别是对
vector
这类基于数组的容器来说。理解清楚这两个属性,能帮你更高效地管理内存和资源。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6719

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3245

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4208

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2865

2025.08.29

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

630

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

343

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

533

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

303

2025.11.27

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn