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

