发布于2026-07-08 阅读(0)
扫一扫,手机访问
先直接说结论:capacity 是 vector 当前“能装多少”的容量上限,reserve 则是你主动告诉它“我要装这么多,现在就分配好内存”。两者配合得当,能避免 90% 的隐式扩容开销。下面这张图能帮你快速建立直观印象:

capacity() 返回的是当前已分配但尚未使用的内存空间能容纳的元素个数;size() 才是实际有多少个元素。二者之间这个差值,就是“空着但已付费的房间”——vector 为了后续扩容提前预留的余量。
常见的一些让人困惑的现象:
vec.size() 是 100,vec.capacity() 却是 128 —— 这不是 bug,是几何扩容留下的缓冲空间clear() 后 size() 变 0,但 capacity() 不变 —— 内存没还,只是清空了内容resize(50) 缩小容器,capacity() 可能不变甚至变大(具体取决于实现)reserve(n) 只在 n > capacity() 时触发内存重分配;否则什么也不做。它不构造对象、不改变 size(),纯粹是“提前租好整层楼”。
典型的使用场景:
vec.reserve(100000)std::filesystem::file_size() 预估容易踩的坑:
reserve(0) 或 reserve(vec.size()) 没效果,别白调reserve(1),capacity 变成 1;但再 push_back 第二个元素仍会扩容(因为 capacity=1,size=1,push_back 触发扩容)当 size() == capacity() 且调用 push_back 时,vector 必须执行三步原子操作:
max(new_size, current_capacity * growth_factor))性能影响:
std::string 成员的类),拷贝/移动成本越高auto it = vec.begin(); vec.reserve(1000); *it 就是未定义行为reserve(n) 改变的是 capacity(),不影响 size();resize(n) 改变的是 size(),可能顺带改 capacity()(如果 n > 当前 capacity)。
典型误用:
vec.reserve(1000) —— 错,size() 还是 0,访问 vec[0] 直接崩溃vec.resize(1000),或 vec.reserve(1000); vec.assign(1000, T{})vec.clear(); vec.shrink_to_fit(); —— 注意 shrink_to_fit 是请求,不保证成功最易被忽略的一点:reserve 对 vector 无效 —— 它是特化模板,底层用位存储,capacity() 和内存布局都不遵循通用规则。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8