推荐首选std::vector实现动态扩容——自动内存管理、语法简洁、安全可靠;扩容行用push_back,扩容列用每行resize;二级指针和一维数组模拟适用特定场景但需谨慎处理内存。

动态扩容二维数组的行与列,核心在于“运行时按需调整尺寸”,不能依赖编译期固定的大小。C++ 中最常用、最稳妥的方式是用 std::vector<:vector>> 实现,它天然支持行列独立增减;若追求极致性能或兼容纯 C 风格,则可选用指针方案,但需手动管理内存。
用 vector 实现行列自由扩容
这是推荐首选——自动内存管理、语法简洁、不易出错。
- 扩容行:直接调用
matrix.push_back(std::vector<int>(new_col_count, 0))</int>,新增一行并初始化指定列数 - 扩容列:遍历每一行,对每行调用
row.resize(new_col_count, 0),统一补零 - 缩容同理:用
resize()传入更小尺寸即可,多余元素自动析构 - 注意:
resize()对外层 vector 调整行数,对每个内层 vector 调整列数,二者完全解耦
用二级指针手动扩容(需谨慎)
适用于对内存布局有强要求的场景(如对接 C 接口),但必须自己处理所有细节。
- 扩容行:分配新指针数组,复制旧指针,为新增行
new int[new_cols],再更新指针 - 扩容列:对每一行,
delete[]原内存,new int[new_cols]并拷贝旧数据 - 关键风险:容易漏删、重复删、越界访问;必须严格遵循“先子后父”释放顺序
- 建议封装成类,把扩容逻辑和内存管理收束在构造/析构/成员函数中
用一维数组模拟 + 索引映射(高效但需计算)
适合大规模、固定结构后期微调的场景,内存连续、缓存友好。
- 行扩容:申请新内存
new int[new_rows * new_cols],逐行拷贝旧数据(old[i * old_cols + j]→new[i * new_cols + j]) - 列扩容:同上,但需注意每行末尾填充默认值
- 访问仍用
data[i * cols + j],不支持arr[i][j]语法,除非额外维护行指针数组 - 优点是释放只需一次
delete[],缺点是每次扩容都要整体拷贝
实际选择建议
日常开发优先选 vector 方案,写法清晰、安全可靠;高频数值计算且尺寸变化少时,可考虑一维模拟;只有在必须控制内存地址或对接遗留系统时,才用二级指针,并务必配套 RAII 封装。











