目前我正在尝试使用此声明创建一个稀疏矩阵:
typedef int Data;
struct Element
{
int i;
int j;
Data value;
};
我允许用户输入他们想要的行数:
int size;
cout << "Enter the number of element: ";
cin >> size;
// Function to construct sparse matrix
constructSparseMatrix(size,3);
我尝试constructSparseMatrix
功能:
void constructSparseMatrix(int row, int col) {
int** arr = new int*[row];
for(int i = 1; i <= row; i++) {
arr[i] = new int[col];
cout << arr[row][col];
}
}
但是当我输入任何数字时,应用程序输出什么,但停止工作。如果我输入2
:
Insert (1 ,2, 3)
Insert (4, 5, 6)
有人能指出我正确的方向吗?也许这很容易,但我对C ++有点新意,所以请忍受我的无知。
答案 0 :(得分:1)
您收到的细分错误是由以下行引起的:
cout << arr[row][col];
在这种情况下,row
和col
是矩阵的维度,因此元素从0
到row - 1
,从0
到{ {1}}。当您访问col - 1
时,您访问的元素超出范围。
更不用说你的arr[row][col]
循环也超出范围:
for
并将从for(int i = 1; i <= row; i++) {
而不是1
开始。
正确的功能看起来更像是:
0
最后,我推荐一本关于C ++的好书。很明显,你缺少很多C ++的基础知识。 int** constructSparseMatrix(int row, int col) {
int** arr = new int*[row];
for(int i = 0; i < row; i++) {
arr[i] = new int[col];
for (int k = 0; k < col; k++)
arr[i][k] = /* initialize element (i, k) */;
}
return arr;
}
和new
是非常高级的主题。我建议先从delete
,std::array
和std::vector
开始。
稀疏矩阵通常不使用NxM元素的实际矩阵(数组)来实现;用于密集矩阵(其中大多数元素与std::map
不同)。
可能的实现是使用0
,您可以将2D indeces映射到特定元素。对于其他可能的实现,请查看this page。
使用提供各种矩阵的Boost.uBLAS更容易的替代方案。