如何为new创建的动态数组实现类似push_back的功能?
手动实现动态数组的push_back功能(不用vector)
嘿,我懂你想自己用new创建的动态数组来模拟vector的push_back对吧?毕竟vector本质就是封装了动态扩容逻辑的数组,咱们手动实现的话,核心就是自己搞定内存扩容和元素计数这两个关键点。
首先,你需要几个变量来跟踪数组的状态:
- 指向数组的指针(就是你声明的
placeholder1) - 当前数组的容量(capacity):也就是数组最多能容纳的元素数量
- 当前已存储的元素数量(size):已经存入数组的元素个数
步骤1:初始化基础状态
先把核心变量定义好:
#include <string> #include <fstream> int main() { std::string* placeholder1 = new std::string[5]; // 初始容量设为5 int capacity = 5; int size = 0; // 初始时没有存储任何元素
步骤2:实现自定义的push_back函数
因为new出来的数组大小是固定的,当size等于capacity的时候,就必须扩容了。常见的高效扩容策略是把容量翻倍(这种方式的均摊时间复杂度是O(1),能避免频繁扩容带来的性能损耗)。咱们写个函数来处理这个逻辑:
void push_back(std::string*& arr, int& capacity, int& size, const std::string& value) { // 检查是否需要扩容 if (size == capacity) { // 1. 申请一块更大的内存(这里用2倍原容量) int new_capacity = capacity * 2; std::string* new_arr = new std::string[new_capacity]; // 2. 把旧数组的元素拷贝到新数组中 for (int i = 0; i < size; ++i) { new_arr[i] = arr[i]; } // 3. 释放旧数组的内存,避免内存泄漏 delete[] arr; // 4. 更新数组指针和容量值 arr = new_arr; capacity = new_capacity; } // 将新元素存入数组,更新已存储元素数量 arr[size] = value; size++; }
步骤3:在文件读取循环中使用自定义push_back
现在你就可以像用vector的push_back一样,把每行文本存入动态数组了:
std::ifstream input_file("your_file.txt"); // 替换成你的目标文件名 std::string linedata; while (std::getline(input_file, linedata)) { push_back(placeholder1, capacity, size, linedata); } // 使用完数组后,一定要记得释放内存! delete[] placeholder1; return 0; }
几个关键注意事项
- 内存泄漏防范:最后必须用
delete[]释放整个数组,否则会造成内存泄漏 - 扩容策略调整:你也可以选择每次固定增加容量(比如每次加5),但翻倍的方式在大多数场景下效率更高
- 自定义类型处理:这里用的是
std::string,它自带默认拷贝构造函数,直接赋值没问题;如果是自定义类型,可能需要手动处理拷贝逻辑
内容的提问来源于stack exchange,提问作者user3118602
相关产品推荐
相关产品推荐

