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); 
} 
相關問題