稀疏矩阵构造函数不将参数存储在对象中
Sparse matrix Constructor doesn't store parameter in object
我想存储一个从文件中读取的稀疏矩阵,但是当构造函数完成时,参数没有存储在对象中。
文件有一个"row col"结构,其中row是矩阵行,col是矩阵列。如果文件的坐标存在,则在该位置存储一个1,否则存储一个0。
这是构造函数:
MatriuSparse::MatriuSparse(const string nomFitxer) {
fstream fitxer;
fitxer.open(nomFitxer);
int m_columna;
int m_fila;
m_Ncolumnes = 8;
m_Nlinies = 8;
vector<vector<int> > matriu;
for (int i = 0; i < m_Nlinies; i++)
{
vector<int> temporal;
for (int j = 0; j < m_Ncolumnes; j++) {
temporal.push_back(0);
}
matriu.push_back(temporal);
}
fitxer >> m_fila >> m_columna;
while (!fitxer.eof())
{
matriu[m_fila][m_columna] = 1;
fitxer >> m_fila >> m_columna;
}
fitxer.close();
//Here matrix has size 8
}
这是主要的:
string nomFitxer = "Xarxa1.txt";
MatriuSparse m1(nomFitxer);
// Here m1 matrix has size 0
cout << m1;
您的构造函数不会在 class 中存储任何内容,除了您设置为常量值的 m_Ncolumnes
和 m_Nlinies
。其他所有内容都存储在构造函数本地的变量中,一旦构造函数完成,这些变量就会消失。
很有可能你隐藏了同名成员向量。只需删除这一行:
vector<vector<int> > matriu; // hiding the member matriu ?
不相关 1: 您无需嵌套循环即可轻松初始化向量:
matriu = vector<vector<int>>(m_Nlinies, vector<int>(m_Ncolumnes, 0));
不相关 2:eof()
上的循环无法正常工作。你必须循环提取。因此,一旦您的 matriu 初始化,只需执行以下操作:
while (fitxer >> m_fila >> m_columna)
{
matriu[m_fila][m_columna] = 1;
}
您的主要问题是您需要使 matriu
成为 class 的成员,而不是在函数中局部声明它。
另外我还有一些意见。
如果事先知道矩阵的大小是8x8,用vector
就大材小用了,用array
.
命名约定有点奇怪。我假设你使用 m_
来表示成员变量,但是 m_columna
和 m_fila
是局部变量。
你提到了一个稀疏矩阵,但你正在填充的矩阵 matriu
是密集格式。
我想存储一个从文件中读取的稀疏矩阵,但是当构造函数完成时,参数没有存储在对象中。
文件有一个"row col"结构,其中row是矩阵行,col是矩阵列。如果文件的坐标存在,则在该位置存储一个1,否则存储一个0。
这是构造函数:
MatriuSparse::MatriuSparse(const string nomFitxer) {
fstream fitxer;
fitxer.open(nomFitxer);
int m_columna;
int m_fila;
m_Ncolumnes = 8;
m_Nlinies = 8;
vector<vector<int> > matriu;
for (int i = 0; i < m_Nlinies; i++)
{
vector<int> temporal;
for (int j = 0; j < m_Ncolumnes; j++) {
temporal.push_back(0);
}
matriu.push_back(temporal);
}
fitxer >> m_fila >> m_columna;
while (!fitxer.eof())
{
matriu[m_fila][m_columna] = 1;
fitxer >> m_fila >> m_columna;
}
fitxer.close();
//Here matrix has size 8
}
这是主要的:
string nomFitxer = "Xarxa1.txt";
MatriuSparse m1(nomFitxer);
// Here m1 matrix has size 0
cout << m1;
您的构造函数不会在 class 中存储任何内容,除了您设置为常量值的 m_Ncolumnes
和 m_Nlinies
。其他所有内容都存储在构造函数本地的变量中,一旦构造函数完成,这些变量就会消失。
很有可能你隐藏了同名成员向量。只需删除这一行:
vector<vector<int> > matriu; // hiding the member matriu ?
不相关 1: 您无需嵌套循环即可轻松初始化向量:
matriu = vector<vector<int>>(m_Nlinies, vector<int>(m_Ncolumnes, 0));
不相关 2:eof()
上的循环无法正常工作。你必须循环提取。因此,一旦您的 matriu 初始化,只需执行以下操作:
while (fitxer >> m_fila >> m_columna)
{
matriu[m_fila][m_columna] = 1;
}
您的主要问题是您需要使 matriu
成为 class 的成员,而不是在函数中局部声明它。
另外我还有一些意见。
如果事先知道矩阵的大小是8x8,用vector
就大材小用了,用array
.
命名约定有点奇怪。我假设你使用 m_
来表示成员变量,但是 m_columna
和 m_fila
是局部变量。
你提到了一个稀疏矩阵,但你正在填充的矩阵 matriu
是密集格式。