You need to enable JavaScript to run this app. C++不使用std::vector如何实现元素数量未知的数组输入
优惠活动
大模型
产品
解决方案
定价
更多

C++不使用std::vector如何实现元素数量未知的数组输入

未知数量整型输入的无vector实现方案

核心是在堆上手动管理动态数组的内存分配与扩容逻辑,完全复刻std::vector的底层实现思路,不需要预先指定元素总长度,也不依赖vector接口。

具体实现逻辑

  • 初始阶段在堆上分配一块小容量的整型数组,不依赖栈空间(栈空间容量小,且不支持运行时动态调整大小)
  • 循环读取用户输入的元素,每次存入前检查当前已存元素数是否达到已分配的内存容量
  • 一旦存满,按翻倍策略扩容:分配一块容量是原来2倍的新堆内存块,将旧块内的所有元素拷贝到新块,释放旧块的内存,将数组指针指向新块的首地址
  • 持续读入直到用户终止输入(如输入非数字触发EOF、输入自定义终止符)
  • 程序退出前手动释放最终的堆内存块,避免内存泄漏

注意:你之前代码中写的int arr[n]属于编译器提供的可变长度数组(VLA)扩展,并非C++标准支持的语法,跨平台编译时会直接报错,且栈空间有限,无法承载大量输入元素,不适合用于未知长度的存储场景。

可直接运行的示例代码

#include <iostream>
int main() {
    // 初始堆数组容量,可按需调整
    int capacity = 4;
    // 已存入的有效元素个数
    int size = 0;
    // 初始在堆上分配指定容量的整型数组
    int* arr = new int[capacity];

    std::cout << "请输入整数(输入非数字或EOF时结束):" << std::endl;
    int input;
    // 持续读取输入直到无法获取有效整数
    while (std::cin >> input) {
        // 内存块已满,触发扩容
        if (size == capacity) {
            capacity *= 2;
            // 申请新容量的堆内存
            int* new_arr = new int[capacity];
            // 拷贝原有元素到新内存块
            for (int i = 0; i < size; i++) {
                new_arr[i] = arr[i];
            }
            // 释放旧内存块
            delete[] arr;
            // 更新数组指针指向新内存块
            arr = new_arr;
        }
        // 存入当前读入的元素
        arr[size] = input;
        size++;
    }

    // 验证存储结果
    std::cout << "共存储 " << size << " 个整数,内容:" << std::endl;
    for (int i = 0; i < size; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    // 释放最终的堆内存,避免泄漏
    delete[] arr;
    return 0;
}

方案说明

  • 采用容量翻倍的扩容策略时,均摊到每个元素的内存分配开销为O(1),性能和std::vector基本一致
  • 输入终止逻辑可根据需求调整:如果需要约定固定终止值,只需要在while循环内加判断,比如当input == -1时直接break跳出循环即可
  • 整个实现过程没有调用任何std::vector相关接口,完全满足不使用vector的要求

内容的提问来源于stack exchange,提问作者Bhavesh Bhagtani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 09:06:04