C ++ Matrix到动态2D arrray

时间:2016-04-20 16:53:54

标签: c++ arrays pointers matrix dynamic-arrays

让我们说我们在matrix.txt文件中有一个矩阵,存储方式如下:

Image1

我们希望将其转换为:

Image 2

8号(第一个数字)表示2D阵列有多大。之后它意味着: 1连接到2(连接值为1,总是1) 1连接到8 3连接到4

当转换为2D动态数组时,我们希望ARRRAY 0,1 ... 0,7 ... 2,3和soo中的值为1(我没有使用方括号,因为stackoverflow将它们作为链接读取)。

    int number;
int **a = new int*[number];
for (int i = 0; i<number; i++) {
    a[i] = new int[number];
}
for (int i = 0; i<number; i++) {
    delete[]a[i];
}
    delete[]a;

string line;
ifstream myfile("matrix.txt");
if (myfile.is_open())
{
    getline(myfile, line);
     istringstream(line)>> number; 


    while (getline(myfile, line)){
        cout << line << '\n';
        //HERE I SHOULD TURN THOSE NUMBERS INTO VALUES IN 2D ARRAY
    }
    myfile.close();
}

所以我的问题是:如何在二维数组中将这些数字转换成矩阵?

谢谢

2 个答案:

答案 0 :(得分:2)

简单的方法,但可能不是最快的方法,是将行写入std::stringstream,然后从字符串流中读回行,列和值变量。如果您正在读取文件,那么首先读取文件的成本通常会使解析文件的成本相形见绌。如果在您的情况下很重要(并首先配置代码以确保它确实),请考虑手动解析文件。也就是说,这个基本逻辑将成立。

Private Sub Worksheet_Change(ByVal target As Range)

    If Intersect(target, Worksheets("SheetA").Range("V:V")) Is Nothing Then 
        Application.EnableEvents = False
        thisrow = target.Row
        Worksheets("SheetB").Cells(12, 1).Value = Worksheets("SheetA").Range("A" & thisrow).Value
    End If

    Application.EnableEvents = True
End Sub

偏离主题,请考虑使用矩阵类来管理a而不是原始2D数组。 The matrix class here at isocppp.org is good and fast,以及一些非常好的通用建议。

以上带有isocpp矩阵的代码如下所示:

while (getline(myfile, line)){
    cout << line << '\n';
    std::stringstream linestream(line);
    int row;
    int column;
    int value;
    if (linestream >> row >> column >> value)
    {
        a[row-1][column-1] = value;
        a[column-1][row-1] = value;// mirror
    }
    else
    {
        // handle file formatting error
    }
}

几乎相同且更容易使用,因为您不必担心自己管理内存,传递数组维度,或者一些不良代码(例如while (getline(myfile, line)){ cout << line << '\n'; std::stringstream linestream(line); int row; int column; int value; if (linestream >> row >> column >> value) { a(row-1,column-1) = value; a(column-1,row-1) = value;// mirror } else { // handle file formatting error } } )中断一行你的阵列。

附录

此代码

a[4] = 0;

有两个严重的问题:

  1. int number; int **a = new int*[number]; for (int i = 0; i<number; i++) { a[i] = new int[number]; } for (int i = 0; i<number; i++) { delete[]a[i]; } delete[]a; 的大小为a,尚未分配numbernumber可能是任何东西,从一个即时致命的负数(不能有一个负数大小的数组)到一个可能致命的巨大数字(你的计算机有9,223,372,036,854,775,807平方字节的RAM?不这么认为。)< / LI>
  2. 分配后立即删除存储。释放内存是一个很好的习惯,但是最好在使用后释放内存,而不是之前。
  3. 所以:

    number

答案 1 :(得分:1)

我建议您使用STL中的C ++向量而不是不安全的2d C数组。

您可以执行以下操作:

ifstream myfile("matrix.txt");

// Read matrix size
size_t matrix_size = 0;  myfile >> matrix_size;

vector<vector<int> > matrix(matrix_size);
for(size_t i=0; i < matrix.size(); ++i)  matrix[i].resize(matrix_size);
while( myfile.good() )
{
  // Read row,col,val and set matrix value
  int row=0, col=0, val=0;  myfile >> row >> col >> val;    
  --row; --col; // Since your indices go from 1 to N
  if(row < matrix_size && row >= 0 && col < matrix_size && col >= 0) {
    matrix[row][col] = val;   matrix[col][row] = val;
  }
}