Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;矩阵到动态二维阵列_C++_Arrays_Pointers_Matrix_Dynamic Arrays - Fatal编程技术网

C++ C++;矩阵到动态二维阵列

C++ C++;矩阵到动态二维阵列,c++,arrays,pointers,matrix,dynamic-arrays,C++,Arrays,Pointers,Matrix,Dynamic Arrays,假设我们在matrix.txt文件中有一个矩阵,存储方式如下: 我们希望将其转化为: 数字8(第一个数字)表示2D阵列有多大。在此之后,它意味着: 1连接到2(连接值为1,将始终为1) 1连接到8 3与4相连 当转换为2D动态数组时,我们希望ARRRAY 0,1…0,7…2,3中的值为1,然后继续(我没有使用方括号,因为stackoverflow将它们读取为链接) 整数; 整数**a=新整数*[数字]; 对于(int i=0;i编号; while(getline(myfile,line)){

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

我们希望将其转化为:

数字8(第一个数字)表示2D阵列有多大。在此之后,它意味着: 1连接到2(连接值为1,将始终为1) 1连接到8 3与4相连

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

整数;
整数**a=新整数*[数字];
对于(int i=0;i编号;
while(getline(myfile,line)){

我建议你从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;
  }
}
ifstream-myfile(“matrix.txt”);
//读取矩阵大小
大小矩阵大小=0;myfile>>矩阵大小;
向量矩阵(矩阵大小);
对于(size_t i=0;i>row>>col>>val;
--row;--col;//因为索引从1到N
如果(行=0和列=0){
矩阵[row][col]=val;矩阵[col][row]=val;
}
}

简单的方法,但可能不是最快的方法,是将行写入,然后从stringstream中读回行、列和值变量。如果从文件中读取,首先读取文件的成本通常比缓慢解析文件的成本要低。如果在您的情况下这很重要(并首先对代码进行概要分析以确保它确实存在)查看手动解析文件。也就是说,这一基本逻辑将适用

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
    的大小为
    number
    ,而
    number
    尚未分配。
    number
    可以是从立即致命的负数(不能有一个负大小的数组)到潜在致命的巨数(您的计算机有9223372036854775807平方字节的RAM?我不这么认为。)
  • 它会在分配内存后立即删除内存。释放内存是一个很好的习惯,但最好在使用内存后释放内存,而不是在使用之前
  • 因此:

    //在这里定义'a'
    弦线;
    ifstream myfile(“matrix.txt”);
    如果(myfile.is_open())
    {
    getline(myfile,line);
    istringstream(行)>>编号;
    //在此处为'a'分配存储空间
    while(getline(myfile,line)){
    
    可能不仅仅是不安全的。与动态分配的2D数组相比,该向量更易于使用、在程序内部传递和清理。也就是说,如果您想要良好的性能,请使用1D向量并使用
    行*列+列
    伪造第二维度。请阅读“缓存未命中”的影响在一个程序上。如果我理解OP的文件格式,最终的矩阵似乎是对称的,只有右上部分存储在文件中…right@Bob_uu_____________________________________。更好的解决方案是使用类来处理具有一维向量的对称矩阵,并使用正确的运算符[]进行访问。@steiner是的,它比稠密情况更具挑战性;)也许OP的问题/技能有点过火……当它尝试这样做时,我得到一个错误,说a未定义。我提供的只是
    //这里我应该将这些数字转换为2D数组中的值以及围绕它的while循环。你仍然需要剩下的代码来定义
    a
    并打开文件。除非你要使用矩阵x版本。在这种情况下,您需要
    矩阵a(数字,数字)
    想想看,你的数组定义中有一个很严重的错误。进行编辑以帮助你解决这个问题。这很有效,我删除它的部分是错误的,我必须将它移到代码的末尾。但我也必须做一个更改,代码确实在正确的位置添加了1,但其他位置是“NULL”,所以我在创建时给了它们所有的值0。谢谢:)很好的捕获。关于
    std::vector
    的一个很酷的事情是它可以为您进行归零(或者您告诉它使用的任何值)。有时这并不那么酷,因为它需要时间,您可能不希望所有的内容都归零,但您不能让每个人都满意。
    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
        }
    }
    
    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;
    
    // define `a` here
    string line;
    ifstream myfile("matrix.txt");
    if (myfile.is_open())
    {
        getline(myfile, line);
        istringstream(line)>> number; 
    
        // allocate storage for `a` here
    
        while (getline(myfile, line)){
            cout << line << '\n';
            //line reading code goes here
        }
        myfile.close();
    }
    // delete `a` somewhere down here after it's been used.