push_back()和insert()在capacity不足时会触发内存重分配,导致迭代器、指针、引用全部失效;pop_back()、erase()和clear()均不改变capacity。
调用 push_back() 或 insert() 时,若当前容量(capac)不足,vector 会重新分配更大内存块(通常是 1.5× 或 2× 当前容量),把旧元素拷贝/移动过去,再释放旧内存。这意味着所有原有迭代器、指针、引用立即失效。
避免频繁重分配的方法:
reserve(n) 分配足够空间(尤其已知元素总数时)emplace_back() 替代 push_back() 减少临时对象构造开销pop_back() 和 erase() 不影响 capacity,但 clear() 也不缩容——如需真正释放内存,得写 vector().swap(v)
v[i] 是裸访问,不检查越界,行为未定义(常见 crash 或静默读错内存);v.at(i) 会做边界检查,越界抛出 std::out_of_range 异常。
适用场景:
[i]
at(i)
front() 和 back() 同样不检查空容器,调用前务必确认 !v.empty()
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 不是真正删除,只是把保留元素移到前面,返回新逻辑尾部迭代器传参方式直接影响性能和语义:
const std::vector& (避免拷贝,禁止修改)std::vector& (如批量 push 或 clear)std::vector&& + std::move()
vector 的内存布局是连续的,但它的“大小”不等于 sizeof(vector) —— 后者通常只有 24 字节(64 位系统下三个指针),真正数据在堆上。这点常被忽略,导致误判拷贝开销。