有一个关于这个主题的主题,它正在使用数组,但我不能使它与矩阵一起使用。
(主题: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]();
根本不编译。
有任何帮助吗?谢谢
答案 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;