2011-01-18 121 views
2

我无法理解我的程序中有什么问题。我有这样的输入数据:阵列填充错误

01000 
11110 
01000 

我想把它保存到:vector< vector<int> > matrix;

vector< vector<int> > fillMatrix(vector< vector<int> > matrix, int height, int width, ifstream &read) 
{ 
    // Make 2d-array [matrix] 
    matrix.resize(width); 
    for (int i=0; i < width; ++i) 
     matrix[i].resize(height); 

    // Fill it up with data 
    for (int i=0; i < height; ++i) 
    { 
     std::string tempLine; 
     std::getline(read, tempLine); 
     for (int j=0; j < tempLine.length(); ++j) 
     { 
      // This shows right information 
      //std::cout << tempLine[j] << " - " << (int)(tempLine[j] - '0') << "\n"; 
      matrix[i][j] = (int)(tempLine[j] - '0'); 
     } 
    } 

    return matrix; 
} 

matrix = fillMatrix(matrix, 3, 5, ifstreamHandle); 

而现在,函数显示矩阵:

void showMatrix(vector< vector<int> > matrix, int width, int height) 
{ 
    // Show the matrix 
    for (int i=0; i < height; ++i) 
    { 
     for (int j=0; j < width; ++j) 
     { 
      std::cout << matrix[i][j]; 
     } 
     std::cout << "\n"; 
    } 
} 

showMatrix(matrix, 5, 3); 

showMatrix结果:

01000 
11100 
01000 

第二排有错过'1'。怎么了?

+3

你应该真的通过引用传递矩阵。当你按值传递时,它会不必要地复制整个矩阵。 – 2011-01-18 22:30:24

回答

3

创造一个像matrix[i].resize(3)i = 0..4矩阵,但写了进去。当你初始化向量,你的宽度和高度都是错误的。当您稍后从最后两列读取时,结果将不确定。

matrix.resize(width); 
for (int i=0; i < width; ++i) 
    matrix[i].resize(height); 

应该

以不同的顺序
matrix.resize(height); 
for (int i=0; i < height; ++i) 
    matrix[i].resize(width); 

fillMatrix功能有widthheight到在你后面showMatrix调用它。我建议交换fillMatrix中的订单以保持其与showMatrix中的相同。

小心填充每行最多为tempLine.length,这可能会大于width这将导致异常。您也可以从showMatrix中的矢量中获取宽度和高度,而不是将这些作为参数。正如@Charles所说,你应该真的通过引用来传递向量,以避免复制。 fillMatrix中的矢量参数目前相当无用,因为您必须将其返回,除非将其转换为参考并使其功能void

3

首先你是不是在你的代码一致

for (int i=0; i < width; ++i) 
... 
for (int i=0; i < height; ++i) 

所以你正在使用matrix[i][j]其中i = 0..2j=0..4