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
相关产品推荐
相关产品推荐

