C++ vector怎么用 C++动态数组增删改查操作汇总【STL】

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 异常。

适用场景:

  • 性能敏感且确定索引合法 → 用 [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 位系统下三个指针),真正数据在堆上。这点常被忽略,导致误判拷贝开销。