push_back 仅支持末尾插入,高效安全;insert 可插任意位置但开销大且易致迭代器失效。推荐按序追加时用 push_back,需中间/头部插入时才用 insert。

直接说结论:push_back 只能加在末尾、快且安全;insert 能插任意位置,但可能触发内存重分配和元素移动,性能开销大,还容易因迭代器失效出错。
什么时候该用 push_back?
push_back 是 vector 最常用、最推荐的插入方式,适用于「按顺序追加」场景,比如读取文件逐行存入、循环计算结果累积等。
- 只接受一个参数:
v.push_back(value),自动放在末尾 - 内部会检查容量(
capacity()),不够时才重新分配内存(通常是 1.5× 或 2× 增长),摊还时间复杂度 O(1) - 不会使任何现有迭代器、指针或引用失效(除非发生扩容)
- 如果已知元素总数,提前调用
v.reserve(n)能避免多次扩容
什么时候必须用 insert?
只有当你需要把元素插到中间或开头(比如实现优先队列逻辑、维护有序容器、响应用户插入操作),才考虑 insert。它不是“更通用的 push_back”——恰恰相反,它是高风险操作。
- 基本形式:
v.insert(pos, value),其中pos是迭代器(如v.begin() + 3) - 插入位置之后的所有元素都要向后搬移,时间复杂度 O(n),n 是插入点后的元素个数
- 插入可能导致内存重分配,此时所有迭代器、指针、引用全部失效(包括
pos本身!) - 错误写法示例:
auto it = v.begin() + 2; v.insert(it, x); use(it);——it已失效,后续使用是未定义行为
insert 的常见误用与避坑点
很多崩溃或逻辑错都源于对 insert 行为理解偏差,尤其在循环中混用迭代器和插入操作。
立即学习“C++免费学习笔记(深入)”;
- 不要在 for 循环里边遍历边
insert,除非你手动控制索引并跳过新插入项(推荐改用反向遍历或先收集再批量插入) -
v.insert(v.end(), x)功能等价于v.push_back(x),但更慢、更啰嗦,别这么写 - 插入多个相同值:用
v.insert(pos, n, value)比循环调用高效;插入另一个容器的区间:用v.insert(pos, other.begin(), other.end()) - 若频繁在头部插入,vector 不合适,改用
std::deque或std::list(但注意后者不支持随机访问)
真正麻烦的不是语法记不住,而是 insert 后的迭代器状态、内存是否重分配、以及搬移带来的性能毛刺——这些在小数据量下不显眼,一到真实业务数据就突然卡顿或 crash。











