如何使用基本循环创建二维阵列矩阵

时间:2015-07-21 17:50:51

标签: c++ arrays pointers

目前我正在尝试使用此声明创建一个稀疏矩阵:

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 ++有点新意,所以请忍受我的无知。

1 个答案:

答案 0 :(得分:1)

您收到的细分错误是由以下行引起的:

cout << arr[row][col];

在这种情况下,rowcol是矩阵的维度,因此元素从0row - 1,从0到{ {1}}。当您访问col - 1时,您访问的元素超出范围。

更不用说你的arr[row][col]循环也超出范围:

for

并将从for(int i = 1; i <= row; i++) { 而不是1开始。

正确的功能看起来更像是:

0

Live demo

最后,我推荐一本关于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是非常高级的主题。我建议先从deletestd::arraystd::vector开始。

稀疏矩阵通常不使用NxM元素的实际矩阵(数组)来实现;用于密集矩阵(其中大多数元素与std::map不同)。

可能的实现是使用0,您可以将2D indeces映射到特定元素。对于其他可能的实现,请查看this page

使用提供各种矩阵的Boost.uBLAS更容易的替代方案。