2012-09-11 56 views
25

我正在嘗試輸入2D矩陣的維度。然後使用用戶輸入來填充這個矩陣。我嘗試這樣做的方式是通過矢量(矢量矢量)。但是,每當我嘗試讀取數據並將其附加到矩陣時,我都遇到了一些錯誤。向量創建矩陣的向量

//cin>>CC; cin>>RR; already done 
vector<vector<int> > matrix; 
for(int i = 0; i<RR; i++) 
{ 
    for(int j = 0; j<CC; j++) 
    { 
    cout<<"Enter the number for Matrix 1"; 
     cin>>matrix[i][j]; 
    } 
} 

每當我試圖做到這一點,它給我一個下標超出範圍的錯誤。有什麼建議?

+3

你沒有初始化'matrix'。 – elyashiv

+0

@elyashiv實際上,'matrix'被初始化。 –

+1

@Luchian Grigore向量最初是空的。因此,超出範圍的錯誤。 –

回答

43

正因爲如此,你的矢量的兩個維度都爲0

相反,初始化向量,因爲這:

vector<vector<int> > matrix(RR); 
for (int i = 0 ; i < RR ; i++) 
    matrix[i].resize(CC); 

這會給你的尺寸的RR * CC矩陣設置爲0所有元素。

+1

你可以在一個語句中創建一個大小爲'CC'的矢量,並避免調整大小。 – juanchopanza

+0

@juanchopanza你在談論std :: generate還是隻是任務? –

5

我不熟悉C++,但快速瀏覽的文檔顯示,這應該工作:

//cin>>CC; cin>>RR; already done 
vector<vector<int> > matrix; 
for(int i = 0; i<RR; i++) 
{ 
    vector<int> myvector; 
    for(int j = 0; j<CC; j++) 
    { 
     int tempVal = 0; 
     cout<<"Enter the number for Matrix 1"; 
     cin>>tempVal; 
     myvector.push_back(tempVal); 
    } 
    matrix.push_back(myvector); 
} 
+3

正確,但由於後續推回而遭受性能處罰。 –

+8

@LuchianGrigore:從std :: cin中讀取一個矩陣可以殺死你關於性能的論證 – stefan

90

你必須訪問任何元素之前初始化向量到適當大小的矢量。你可以這樣說:

// assumes using std::vector for brevity 
vector<vector<int>> matrix(RR, vector<int>(CC)); 

這將創建的RR大小CC向量的向量,充滿了0

+1

+1:我也是這麼做的。驚訝你是唯一一個給出這個答案的人。順便說一句,我絕不會使用矢量矢量來表示矩陣。 =) – paddy

+1

@paddy我也不會使用它。能夠隨時任意調整任何列或行的大小或在創建後更改矩陣的大小的想法對我來說太可怕了。 – juanchopanza

+0

改變矩陣的尺寸是正常的(在MatLab中你一直都在做),但是在實際應用中,矩陣是一個連續的塊,你所改變的只是行/列(基本上跟蹤步幅-lengths) - 爲矩陣中的元素建立索引,可以根據多維索引計算線性索引。 – paddy

1

試試這個。 m = row,n = col

vector< vector<int> > matrix(m,vector<int>(n)); 

for(i=0;i<m;i++) 
{ 
    for(j=0;j<n;j++) 
    { 
     cin>>matrix[i][j]; 
    } 
    cout<<endl; 
} 
cout<<"::matrix::"<<endl; 
for(i=0;i<m;i++) 
{ 
    for(j=0;j<n;j++) 
    { 
     cout<<matrix[i][j]<<" "; 
    } 
    cout<<endl; 
}