0

0

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

P粉602998670

P粉602998670

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

|

901人浏览过

|

来源于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
,往里面添加了5个整数,那么它的
size()
就是5。

C++ STL容器容量和大小有什么区别 解释capacity和size的不同含义
std::vector 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++ STL容器容量和大小有什么区别 解释capacity和size的不同含义

例如:

sematic
sematic

一个开源的机器学习平台

下载
std::vector 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 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
这类基于数组的容器来说。理解清楚这两个属性,能帮你更高效地管理内存和资源。

相关专题

更多
string转int
string转int

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

312

2023.08.02

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

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

521

2024.08.29

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

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

48

2025.08.29

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

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

189

2025.08.29

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

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

73

2025.09.05

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

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

25

2025.11.16

golang map原理
golang map原理

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

36

2025.11.17

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

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

31

2025.11.27

vlookup函数使用大全
vlookup函数使用大全

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

28

2025.12.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.6万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.4万人学习

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

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号