依赖于输入的C ++矩阵大小不能编译

时间:2010-10-22 12:20:53

标签: c++ matrix

有一个关于这个主题的主题,它正在使用数组,但我不能使它与矩阵一起使用。

(主题:C++ array size dependent on function parameter causes compile errors

总结:

  long rows, columns;
  cin >> rows >> columns;
  char *a = new char [rows];    

在视觉工作室编译很好,但是:

  char **a = new char[rows][columns]; 

  char *a[] = new char[rows][columns];

  char *a[] = new char[rows][columns]();

  char **a = new char[rows][columns]();

根本不编译。

有任何帮助吗?谢谢

3 个答案:

答案 0 :(得分:4)

array-new运算符仅分配1维数组。根据您想要的阵列结构类型,有不同的解决方案。对于仅在运行时已知的维度,您可以创建一个数组数组:

char **a = new char*[rows];
for (int i = 0; i < rows; ++i) {
    a[i] = new char[columns];
}

或一个元素数组,其中包含指向每行第一个元素的相关指针数组(只需要两次点击内存分配器):

char *a = new char[rows*columns];
char **a = new char*[rows];
for (int i = 0; i < rows; ++i) {
    a[i] = a + i*columns;
}

任何一个都允许您通过a[row][column]访问矩阵元素。

另一种解决方案是只使用一维数组并手动生成索引:

char *a = new char[rows*columns];
...
a[columns*row + column]

这可能比前两个解决方案中所需的双重间接更快。

你当然可以将它包装在一个类中以保留2D索引语法的外观:

class MatrixWrapper {
    ...
    char& operator()(int row, int column) { return a_[columns*row + column]; }
    ...
};
...
a(row, column)

答案 1 :(得分:1)

无法按照您的尝试直接分配n维数组。这是一种方法。

int main(){
    unsigned int **p;
    unsigned int rows = 10;
    unsigned int cols = 20;

    p = new unsigned int* [rows];

    for(size_t row = 0; row < rows; row++){
        p[row] = new unsigned int [cols];
    }

    for(size_t row = 0; row < rows; row++){
        delete [] p[row];
    }

    delete [] p;
}

答案 2 :(得分:0)

如果您要在c ++中使用c-arrays(而不是std :: vector),那么你就会遇到这样的事情:

long rows    = 0;
long columns = 0;
cin >> rows >> columns;

// declaration
long** a = new long* [rows];
for(long i = 0; i < rows; ++i)
{
    a[i] = new long[cols];
}

// initialization
for(long j = 0; j < rows; ++j)
{
    for(long i = 0; i < rows; i++)
    {
        a[i][j] = 0;
    }
}

// delete sub-arrays
for(long i = 0; i < rows; ++i)
{
    delete[] a[i];
}

// delete array
delete[] a;