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