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

C++多维数组类Resize方法数据丢失问题排查

C++多维数组类resize方法未正确保留数据的问题原因及修复

问题原因

你的resize方法存在两个核心问题:

  • 仅修改了rows和cols成员变量,且只对外层vector(行维度)执行了resize操作,完全未处理内层每个vector的列维度。
  • 现有实现中,调整行时新增的行会用默认值填充,但旧有行的列数仍保持原始长度,导致数组结构不一致——既无法截断多余列,也无法为旧行扩展列,最终表现为数据未按预期保留、结构异常。

比如你的测试用例中,调用resize(2,2)后,仅外层vector被截断为2行,但每行的vector依然是4列的长度,所以打印时仍会输出4个元素,而非预期的2个。

修复方案

修改resize方法,先调整行维度,再遍历每一行调整列维度,确保所有行的列数同步更新,同时保留原有行的有效数据:

void resize(size_t newRows, size_t newCols) {
    // 先调整行数量,新增行初始化为空vector,后续统一调整列数
    array.resize(newRows);
    // 遍历每一行,调整列数,自动保留原有数据(超出部分截断,不足部分补默认值)
    for (auto& row : array) {
        row.resize(newCols);
    }
    // 更新成员变量
    rows = newRows;
    cols = newCols;
}

验证结果

修改后运行原测试代码,输出将符合预期:

1 0 0 0
0 2 0 0
0 0 3 0

1 0
0 2

额外提示

你的transpose方法存在索引错误:transposed[i][j] = array[i][j]; 应该改为 transposed[j][i] = array[i][j];,否则会因越界导致未定义行为。

内容的提问来源于stack exchange,提问作者Zohaib Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:53:30