C++ C++;矩阵到动态二维阵列
假设我们在matrix.txt文件中有一个矩阵,存储方式如下: 我们希望将其转化为: 数字8(第一个数字)表示2D阵列有多大。在此之后,它意味着: 1连接到2(连接值为1,将始终为1) 1连接到8 3与4相连 当转换为2D动态数组时,我们希望ARRRAY 0,1…0,7…2,3中的值为1,然后继续(我没有使用方括号,因为stackoverflow将它们读取为链接)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)){
整数;
整数**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.