2017-04-24 57 views
0

我使用的矢量的矢量创建一个类似二维数组的子矩阵:C++寻找一个清洁,高效的方式来获得

std::vector<std::vector<int> > matrix = { 
     {1, 2, 3, 4, 4, 6, 7, 8, 9}, 
     {1, 2, 3, 5, 4, 6, 7, 8, 9}, 
     {1, 2, 3, 4, 4, 6, 7, 8, 9} 
    }; 

现在我想提取子矩阵的规格:

1) all rows 
2) the first 4 columns 

我是新来c++所以我想出了在现在最好的是:

if (matrix[n][m-1] >= matrix[n][m]) 
    { 
     std::vector<std::vector<int> > submatrix(3); 
     for (int i=0; i < 3; i++) { 
      std::vector<int> slice(m); 
      for (int j=0; j < m; j++){ 
       slice[i] = matrix[i][j]; 
      } 
      submatrix[i] = slice; 
     } 
     return find_a_peak(submatrix); 
    } 

其中m = 4;

这只是为了练习,所以请建议一个干净的方式来做到这一点。我是一名经过培训的Python程序员,所以在numpy这很容易。但我想在学习第三方库之前了解c++的基础知识。

+0

一个'std :: vector >'不应该用于矩阵。围绕单个'std :: vector '具有'n * m'大小的包装会更好。也是一个非常好的锻炼! –

+0

看来,在内部for循环中,赋值应该是slice [j] = matrix [i] [j]'。在这种情况下,可以用'submatrix [i] = std :: vector (matrix [i] .begin(),matrix [i] .begin()+ m)替换'for' 。请记住,假定'm'小于'matrix'中的列数。 – Peter

+0

@GuillaumeRacicot可以请您详细说明一下吗?也许有链接? –

回答

1

您可以替换到std::vector的构造函数,迭代器的调用内循环,并使用std::next从一开始就得到了迭代四个要素:

if (matrix[n][m-1] >= matrix[n][m]) { 
    std::vector<std::vector<int>> submatrix; 
    for (int i=0; i < 3; i++) { 
     submatrix.push_back(matrix[i].begin(), std::next(matrix[i].begin(), m)); 
    } 
    return find_a_peak(submatrix); 
} 
+0

使用'g ++'作为'C++ 11'标记的编译器我得到了'error:没有匹配的成员函数来调用'push_back' submatrix.push_back(matrix [i] .begin(),std :: next(matrix [i] .begin(),m));' –

+0

在这里,'submatrix'是一个函数声明,而不是一个变量。查找“最令人头疼的解析”。 – Peter

+0

@SamHammamy对不起,我忘了删除括号。请再试一次。 – dasblinkenlight

0

使用的std::vector这需要两个构造迭代器作为参数。

if (matrix[n][m-1] >= matrix[n][m]) 
{ 
    std::vector<std::vector<int> > submatrix; 
    for (int i=0; i < matrix.size(); i++) { 
     submatrix.push_back(std::vector<int>(matrix[i].begin(), matrix[i].begin() + m)); 
    } 
    return find_a_peak(submatrix); 
} 
相关问题