vector的size()表示当前元素个数,capacity()表示已分配内存可容纳的最大元素数,capacity()≥size();当size()==capacity()时push_back()触发倍增扩容(如1.5×或2×),导致内存重分配、元素搬移及迭代器失效。

vector 的 size() 是当前有多少个元素,capacity() 是目前分配了多少内存空间(能装多少个,不管有没有装满)——两者数值经常不等,且 capacity() 永远 ≥ size()。
为什么 push_back 之后 capacity 突然变大了?
当 size() == capacity() 时再调用 push_back(),vector 必须重新分配内存。它不会只多申请 1 个元素空间,而是按倍增策略(常见是 1.5× 或 2×)扩大容量,以减少频繁重分配。
- 比如初始
capacity() == 15、size() == 15,push_back()后可能变成capacity() == 22或30,具体取决于 STL 实现 - 这个过程会拷贝所有旧元素到新内存,原指针/迭代器/引用全部失效
- 如果你提前知道最终要存 N 个元素,直接
v.reserve(N)可避免多次扩容
resize() 和 reserve() 完全不是一回事
resize(n) 改的是 size():它会调整元素个数,必要时构造或销毁元素;reserve(n) 改的是 capacity():只预分配内存,不碰已有元素,也不改变 size()。
-
v.resize(10):若原size()是 3,就新增 7 个默认值(如int为 0);若原size()是 15,就删掉后 5 个 -
v.reserve(10):若原capacity()已是 12,该调用无效果;若原capacity()是 5,就会把容量扩到 ≥10,但size()仍保持不变 - 误用
reserve()当作resize(),会导致访问越界(因为size()没变,operator[] 或 at() 仍只认已有的元素)
哪些操作会触发 capacity 变化?
只有显式请求内存增长或收缩的操作才可能改 capacity(),多数读写操作只影响 size()。
立即学习“C++免费学习笔记(深入)”;
- 会改
capacity()的:reserve()、resize()(当新 size > 当前 capacity)、push_back()/insert()(导致扩容时)、shrink_to_fit() - 不会改
capacity()的:pop_back()、clear()、erase()、at()、operator[]、front()/back() -
clear()后size()变 0,但capacity()通常不变 —— 这是故意的,为后续复用预留空间
最常被忽略的一点:capacity() 是实现细节,不同编译器、不同 STL 版本的扩容系数可能不同;不要硬编码依赖某次 capacity() 增长的具体值,而应靠 reserve() 主动控制。


















