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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:12:43