跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

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
异常。 适用场景: 立即学习 “ C++免费学习笔记(深入) ”; C函数速查手册(CHM版) C函数速查手册(CHM版) 下载 性能敏感且确定索引合法 → 用
[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 位系统下三个指针),真正数据在堆上。这点常被忽略,导致误判拷贝开销。

相关文章