如何高效获取二维vector的子矩形数组?含一维模拟二维实现方案
从二维整数数组中提取矩形子数组的高效实现
一、嵌套vector(int2D)方案
针对你已实现的一维数组提取逻辑,二维场景需要同时指定行范围和列范围,逐行提取对应列区间的元素并组合成新的二维数组:
typedef std::vector<int> int1D; typedef std::vector<int1D> int2D; // 一维数组区间提取(复用你已实现的逻辑,优化为const引用传参) int1D Copy1D(const int1D& array, int startIndex, int endIndex) { return int1D(array.begin() + startIndex, array.begin() + endIndex + 1); } // 二维矩形子数组提取 int2D Copy2D(const int2D& array, int startRow, int endRow, int startCol, int endCol) { int2D result; result.reserve(endRow - startRow + 1); // 预分配行内存,减少扩容开销 for (int row = startRow; row <= endRow; ++row) { result.push_back(Copy1D(array[row], startCol, endCol)); } return result; }
关键优化点
- 传递
const引用避免原数组的不必要拷贝,仅复制需要的子区间元素 - 对结果数组提前
reserve内存,减少vector动态扩容的性能损耗
二、一维vector模拟二维数组方案
用一维vector存储二维数据时,核心是通过坐标转换公式映射二维位置到一维索引:假设原数组有rows行、cols列,则(row, col)对应的一维索引为row * cols + col。该方案内存连续性更好,性能优势更明显。
实现代码
typedef std::vector<int> intFlat2D; // 二维坐标转一维索引的工具函数 inline int getIndex(int row, int col, int totalCols) { return row * totalCols + col; } // 提取矩形子数组(返回一维形式的结果) intFlat2D CopyFlat2D(const intFlat2D& array, int totalCols, int startRow, int endRow, int startCol, int endCol) { int subRows = endRow - startRow + 1; int subCols = endCol - startCol + 1; intFlat2D result(subRows * subCols); // 直接分配目标内存,避免扩容 int destIdx = 0; for (int row = startRow; row <= endRow; ++row) { int srcStartIdx = getIndex(row, startCol, totalCols); // 批量拷贝整列区间,比逐个赋值效率更高 std::copy(array.begin() + srcStartIdx, array.begin() + srcStartIdx + subCols, result.begin() + destIdx); destIdx += subCols; } return result; } // 可选:将一维结果转为嵌套vector结构(如需保持二维直观结构) int2D FlatToNested(const intFlat2D& flatArray, int cols) { int2D result; int rows = flatArray.size() / cols; result.reserve(rows); for (int row = 0; row < rows; ++row) { int start = row * cols; result.emplace_back(flatArray.begin() + start, flatArray.begin() + start + cols); } return result; }
方案核心优势
- 内存连续性强:一维vector的内存是连续块,缓存命中率更高,批量拷贝性能优于嵌套vector的分散内存
- 内存开销更低:嵌套vector会存储多个一维vector的控制块,一维模拟方案仅需一个控制块,内存占用更紧凑
- 拷贝效率更高:通过
std::copy批量复制整行的列区间,比嵌套方案逐行构造一维vector的开销更低
内容的提问来源于stack exchange,提问作者Abdullah Jaffer
相关产品推荐
相关产品推荐

