原生C++数组无法真正插入元素,必须预留空间或改用std::vector;手动搬移需逆向操作防覆盖,vector::insert()自动处理扩容与移动,最安全高效。

插入前必须预留空间或重新分配内存
原生 C++ 数组(int arr[10])是固定长度的,无法在中间“插入”元素——本质是内存连续且不可扩展。所谓“插入”,实际是手动搬移后续元素,或换用支持动态操作的容器。
常见错误是试图直接写 arr[5] = x 然后“腾出空位”,结果越界或覆盖数据。真正可行的前提只有两个:要么数组本身有冗余空间(比如只用了前 7 个,但声明了 10 个);要么改用 std::vector。
- 如果坚持用裸数组:需确保总长度 ≥ 当前元素数 + 待插入数,否则必出错
-
std::vector是更合理的选择,它封装了内存重分配和元素搬移 - 手写搬移时,必须从尾部开始逆向复制,避免覆盖未处理元素
std::vector::insert() 是最安全的插入方式
std::vector 的 insert() 成员函数专为这类操作设计,支持在任意迭代器位置插入单个或多个相同/不同值的元素,内部自动处理容量检查、内存扩容和元素移动。
例如,在索引 3 的位置插入 4 个值为 99 的元素:
立即学习“C++免费学习笔记(深入)”;
std::vector<int> v = {1, 2, 3, 4, 5};
v.insert(v.begin() + 3, 4, 99); // 结果: {1,2,3,99,99,99,99,4,5}若要插入一组不同元素(如 {10, 20, 30}),可用迭代器范围:
std::vector<int> to_insert = {10, 20, 30};
v.insert(v.begin() + 3, to_insert.begin(), to_insert.end());- 插入点用
v.begin() + n表示第 n 个位置(0 起始),不是下标v[n] - 插入后,原位置及之后的元素自动后移,
v.size()增加对应数量 - 若容量不足,
insert()会触发 reallocation,原有迭代器/引用可能失效
手动在裸数组中“模拟插入”极易出错
仅当明确控制数组长度、且确认有足够空间时才考虑手动搬移。典型流程:先将插入点后的所有元素整体后移 N 位,再填入新元素。
假设 int arr[10] 当前存了 7 个元素(size = 7),想在索引 2 处插入 3 个新值:
int new_vals[] = {100, 200, 300};
int insert_pos = 2;
int count = 3;
<p>// ① 检查空间:size + count <= 10 ?
// ② 从尾部开始搬移(关键!)
for (int i = size - 1; i >= insert_pos; --i) {
arr[i + count] = arr[i];
}
// ③ 填入新值
for (int i = 0; i < count; ++i) {
arr[insert_pos + i] = new_vals[i];
}
size += count;- 搬移方向反了(正向循环)会导致数据被覆盖,结果全乱
- 没检查
size + count 就操作,必然越界写入 - 忘记更新逻辑长度
size,后续遍历会读到旧垃圾值 - 这种代码难以复用,也不支持类型泛化,纯属临时应急
性能与边界条件必须显式判断
无论用 vector::insert() 还是手写逻辑,插入位置是否合法、容量是否充足、插入数量是否为零,这些都不是可选检查。
例如,对 v.insert(v.begin() + pos, ...):
-
pos > v.size()是未定义行为,运行时可能崩溃 -
pos == v.size()是合法的,等价于push_back - 插入 0 个元素(如
v.insert(it, 0, x))是允许的,但无实际效果 - 大量重复插入(尤其在头部)会导致 O(n²) 时间复杂度,应考虑用
std::deque或预分配
裸数组更麻烦:每次插入都要重算偏移、搬移、更新 size,稍有疏忽就破坏数据完整性。真要频繁中间插入,别硬扛数组。


















