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

如何高效获取二维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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:42:52