2012-09-11 168 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; 
}