push_back()和insert()在capacity不足时会触发内存重分配,导致迭代器、指针、引用全部失效;pop_back()、erase()和clear()均不改变capacity。

vector 增删元素时,哪些操作会触发内存重分配?
调用 push_back() 或 insert() 时,若当前容量(capacity())不足,vector 会重新分配更大内存块(通常是 1.5× 或 2× 当前容量),把旧元素拷贝/移动过去,再释放旧内存。这意味着所有原有迭代器、指针、引用立即失效。
避免频繁重分配的方法:
- 预先用
reserve(n)分配足够空间(尤其已知元素总数时) - 用
emplace_back()替代push_back()减少临时对象构造开销 -
pop_back()和erase()不影响 capacity,但clear()也不缩容——如需真正释放内存,得写vector().swap(v)
用下标访问和 at() 的区别在哪?
v[i] 是裸访问,不检查越界,行为未定义(常见 crash 或静默读错内存);v.at(i) 会做边界检查,越界抛出 std::out_of_range 异常。
适用场景:
立即学习“C++免费学习笔记(深入)”;
- 性能敏感且确定索引合法 → 用
[i] - 调试阶段或用户输入作为索引 → 必须用
at(i) - 注意:
front()和back()同样不检查空容器,调用前务必确认!v.empty()
删除元素时,erase-remove 惯用法为什么不能直接删单个值?
erase() 删除的是迭代器位置,不是值;想删掉所有等于某值的元素,不能写 v.erase(5)(语法错误),而要用 std::remove 移动元素 + erase() 截断:
v.erase(std::remove(v.begin(), v.end(), 5), v.end());
如果只删第一个匹配项:
- 用
std::find()找到迭代器,再传给erase() - 例如:
auto it = std::find(v.begin(), v.end(), 5); if (it != v.end()) v.erase(it); - 注意:
remove不是真正删除,只是把保留元素移到前面,返回新逻辑尾部迭代器
vector 作为函数参数传值、传引用、移动语义怎么选?
传参方式直接影响性能和语义:
- 只读访问 →
const std::vector(避免拷贝,禁止修改)& - 需要修改原容器 →
std::vector(如批量 push 或 clear)& - 函数内部要“接管”数据且原变量后续不再使用 →
std::vector+&& std::move() - 不要默认传值:哪怕 vector 很小,拷贝仍涉及 size/capacity/指针三字段复制 + 内存分配(除非 T 是 trivial 类型且你明确控制了 small buffer 优化)
vector 的内存布局是连续的,但它的“大小”不等于 sizeof(vector) —— 后者通常只有 24 字节(64 位系统下三个指针),真正数据在堆上。这点常被忽略,导致误判拷贝开销。










