size()是当前有效元素个数,capacity()是已分配内存能容纳的元素上限;size()≤capacity()恒成立,下标合法范围为[0, size())。

vector 的 size() 和 capacity() 完全不是一回事,混淆它们会导致内存浪费、意外重分配或越界访问。
size() 是当前有效元素个数,capacity() 是已分配但未用的内存空间上限
size() 返回容器中实际存储的元素数量,即下标合法范围是 [0, size());capacity() 返回当前已向系统申请、但尚未被填满的总内存块能容纳的元素个数。二者关系恒为:size() 。
-
capacity()为 0 时,size()必然也为 0(空 vector 初始状态) -
push_back()可能使size()增加,当突破capacity()时触发自动扩容(通常翻倍),此时capacity()突增,旧元素被拷贝/移动 -
clear()只清空元素(size()归零),不释放内存(capacity()不变)
reserve() 控制 capacity,resize() 控制 size
想预留空间避免频繁扩容,用 reserve(n);想确定容器长度并初始化元素,用 resize(n) 或 resize(n, value)。
-
reserve(n):仅影响capacity(),不改变size(),也不构造/析构任何元素;若n ,调用无效 -
resize(n):若n > size(),会构造新元素(默认初始化),size()和capacity()都可能变(后者在需要时扩容);若n ,则销毁尾部元素,size()减小,capacity()不变 - 没有
shrink_to_fit()时,capacity()永远不会自动缩小,哪怕size()已经很小
capacity() 为 0 不代表没分配内存,更不等于“未初始化”
刚声明的 std::vector,v.capacity() 通常是 0,但这只是标准允许的实现策略之一;某些编译器/STL 实现可能初始分配小块内存(如 1 或 2 个元素),capacity() 非零。关键在于:不能依赖初始 capacity() 值做任何假设。
立即学习“C++免费学习笔记(深入)”;
- 不要用
capacity() == 0判断 vector 是否“真正空”,应始终用empty()或size() == 0 - 不要对
data()指针做capacity()长度的读写——超出size()的部分未初始化,行为未定义 - 调试时打印
size()和capacity()对比,比单看一个值更能暴露内存使用异常
迭代器失效只和 capacity 变化强相关
只有当 capacity() 改变(即发生内存重分配)时,所有指向该 vector 的迭代器、指针、引用才失效;单纯 size() 变化(如 pop_back()、erase())不会导致失效(除非删的是最后一个元素且你持有其后一位置的迭代器)。
-
push_back()、insert()、resize()(扩大)可能触发重分配 → 迭代器失效 -
reserve()若实际扩容 → 迭代器全部失效;若未扩容 → 安全 -
shrink_to_fit()是请求式操作,若成功缩容 → 迭代器失效;但不保证一定成功
真正容易出问题的地方,往往不是不知道这两个函数存在,而是把 capacity() 当成“可用空间”去写数据,或者误以为 clear() 后内存就还回去了。别信直觉,每次访问 data() + capacity() 范围前,先确认是否在 size() 内。










