我无法理解程序中的错误。我有这样的输入数据:
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'。怎么了?
答案 0 :(得分:3)
首先,你的代码不一致
for (int i=0; i < width; ++i)
...
for (int i=0; i < height; ++i)
所以你要为matrix[i].resize(3)
创建i = 0..4
之类的矩阵,但是使用matrix[i][j]
i = 0..2
和j=0..4
答案 1 :(得分:3)
初始化矢量时,宽度和高度错误。当您稍后从最后两列读取时,结果将是未定义的。
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
函数的width
和height
的顺序与您稍后在showMatrix
中调用的顺序不同。我建议在fillMatrix
中交换订单,使其与showMatrix
中的订单保持一致。
小心地将每一行填充到tempLine.length
,这可能会大于width
,这将导致异常。你也可以从showMatrix
中的向量中获取宽度和高度,而不是将它们作为参数。正如@Charles所说,你应该通过引用传递向量以避免复制。 fillMatrix
中的vector参数目前是无用的,因为你必须返回它,除非你把它变成一个引用并使函数void
。