vector::insert在指定迭代器位置插入单个元素,需提供有效迭代器(如begin()、end()或begin()+n),否则行为未定义;插入可能触发重分配,使所有迭代器、引用、指针失效。

vector::insert 在指定迭代器位置插入单个元素
直接在 vector 的任意位置插入一个元素,必须提供有效的插入位置迭代器(不是下标),否则行为未定义。最常用的是用 begin()、end() 或通过 begin() + n 计算出的位置。
注意:插入可能导致内存重分配,所有现存迭代器、引用、指针失效。
std::vectorv = {1, 2, 4, 5}; // 在索引 2 处(即值为 4 的前面)插入 3 v.insert(v.begin() + 2, 3); // v 变为 {1, 2, 3, 4, 5}
-
v.begin() + n是合法的,但n必须满足0 ;越界(如n > v.size())是未定义行为,不会抛异常 - 插入到
v.end()等价于push_back(),但效率略低 - 如果插入后容量不足,会重新分配内存并拷贝/移动所有元素——对大 vector 影响明显
一次插入多个相同元素或初始化列表
除了单个值,insert 还支持重复插入某值多次,或从 initializer list 插入一组值,避免手动循环。
std::vectorv = {'a', 'd'}; v.insert(v.begin() + 1, 2, 'b'); // 在索引 1 插入两个 'b' → {'a','b','b','d'} v.insert(v.end(), {'c', 'e'}); // 插入 initializer list → {'a','b','b','d','c','e'}
- 重复插入用
insert(pos, count, value),count为 0 是安全的(无操作) - initializer list 版本要求 C++11 起,且元素类型必须能隐式转换自 list 中类型
- 不要用
insert(v.begin(), v.size(), x)来“清空并填满”,这会先复制再覆盖,应改用assign()
用另一个 vector 的区间插入(常见误用点)
想把另一个容器的一段内容插进来,得确保源区间有效,且不能和目标 vector 是同一个对象——否则迭代器失效导致未定义行为。
立即学习“C++免费学习笔记(深入)”;
std::vectorsrc = {10, 20, 30}; std::vector dst = {1, 2}; dst.insert(dst.begin() + 1, src.begin(), src.end()); // ✅ 正确:{1,10,20,30,2}
- 若错误地写成
dst.insert(dst.begin(), dst.begin(), dst.end()),源迭代器在插入过程中立刻失效,结果不可预测 - 源区间可以是其他容器(如
list、数组)的合法迭代器对,只要类型兼容 - 该重载不做范围检查,传入无效迭代器(如
src.end() + 1)不会报错,但崩溃大概率发生
插入时性能与异常安全的关键细节
插入操作是否强异常安全,取决于元素类型的构造/拷贝是否可能抛异常。标准库保证:若插入中途抛异常,vector 状态不变(除非是移动构造且不抛异常的类型)。
- 对
std::string、std::vector等含动态内存的类型,插入大量元素前建议先reserve()避免多次重分配 - 用
emplace_insert(C++17 起)可就地构造,避免临时对象拷贝,比如:v.emplace_insert(v.begin(), 1, 2, 3)构造一个tuple插入 - 千万别用下标访问方式(如
v[5])去“定位”插入点——它不返回迭代器,也不能用于insert










