You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中删除元素后如何缩减动态数组的长度?

如何缩减C++动态数组删除元素后的长度?

你当前用new创建了固定长度的动态数组,删除元素后只是移动了元素位置、把最后一位设为0,但数组的实际内存长度并没有改变。要真正缩减数组长度,直接修改原数组的内存块大小是做不到的——因为new分配的内存块大小是固定的,无法动态调整。必须通过以下方式实现:

手动实现数组缩减的步骤

  1. 创建一个新的、长度比原数组小1的动态数组
  2. 将原数组中需要保留的元素拷贝到新数组
  3. 释放原数组占用的内存
  4. 更新原指针指向新数组,同时更新记录数组长度的变量

修改后的实现代码

针对你提供的场景,我们可以改写函数,让它能够返回新的数组指针,并同步更新数组长度:

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:45:26