C++中删除元素后如何缩减动态数组的长度?
如何缩减C++动态数组删除元素后的长度?
你当前用new创建了固定长度的动态数组,删除元素后只是移动了元素位置、把最后一位设为0,但数组的实际内存长度并没有改变。要真正缩减数组长度,直接修改原数组的内存块大小是做不到的——因为new分配的内存块大小是固定的,无法动态调整。必须通过以下方式实现:
手动实现数组缩减的步骤
- 创建一个新的、长度比原数组小1的动态数组
- 将原数组中需要保留的元素拷贝到新数组
- 释放原数组占用的内存
- 更新原指针指向新数组,同时更新记录数组长度的变量
修改后的实现代码
针对你提供的场景,我们可以改写函数,让它能够返回新的数组指针,并同步更新数组长度:
#include <iostream> using namespace std; int* delAndShrink(int* arr, int& n) { // 查找值为3的元素位置 int pos = -1; for (int i = 0; i < n; i++) { if (arr[i] == 3) { pos = i; break; // 找到第一个目标元素就停止,避免重复覆盖pos } } if (pos == -1) { // 未找到要删除的元素,直接返回原数组 return arr; } // 创建长度减1的新数组 int* newArr = new int[n - 1]; // 拷贝目标位置之前的元素 for (int i = 0; i < pos; i++) { newArr[i] = arr[i]; } // 拷贝目标位置之后的元素 for (int i = pos; i < n - 1; i++) { newArr[i] = arr[i + 1]; } // 释放原数组内存,避免内存泄漏 delete[] arr; // 更新数组长度 n--; // 返回新数组指针 return newArr; } int main() { int* arr = new int[5]; for (int i = 0; i < 5; i++) { arr[i] = i; } int n = 5; // 调用函数并更新数组指针 arr = delAndShrink(arr, n); // 输出验证 for (int i = 0; i < n; i++) { cout << arr[i] << " "; } // 最后记得释放新数组内存 delete[] arr; return 0; }
更简便的方案:使用std::vector
如果不需要手动管理内存,C++标准库的std::vector是更好的选择——它内置了动态调整大小的能力,删除元素时可以直接调用erase方法自动缩减容器长度,代码更简洁且安全:
#include <iostream> #include <vector> using namespace std; int main() { vector<int> arr(5); for (int i = 0; i < 5; i++) { arr[i] = i; } // 删除值为3的元素 for (auto it = arr.begin(); it != arr.end(); ) { if (*it == 3) { it = arr.erase(it); // erase返回下一个有效迭代器 } else { ++it; } } // 输出结果 for (int num : arr) { cout << num << " "; } return 0; }
内容的提问来源于stack exchange,提问作者Ido Divon
相关产品推荐
相关产品推荐

