3

我在用 C++ 创建二维动态数组时遇到问题。我希望它具有“行”的动态数量(例如 numR)和“列”的固定(例如 2)数量。

我试着这样做:

const numC = 2;
int numR;
numR = 10;
double *myArray[numC];
myArray = new double[numR];

不幸的是,它不起作用。有可能以这种方式做到吗?

当然,我可以使用double **myArray和初始化它,就好像两个维度都是动态的(将 numC 用作循环中的限制器),但如果可能的话,我想避免它。

提前致谢。

4

4 回答 4

6

有可能以这种方式做到吗?

是的:

double (*myArray)[numC] = new double[numR][numC];
// ...
delete[] myArray;

这可能看起来有点不寻常,但 5.3.4 §5 明确指出:

的类型new int[i][10]int (*)[10]

请注意,许多程序员不熟悉 C 声明符语法,也不会理解这段代码。此外,手动动态分配也不是异常安全的。对于这些原因,数组向量更好:

#include <vector>
#include <array>

std::vector<std::array<double, numC> > vec(numR);
// ...
// no manual cleanup necessary

替换std::arraystd::tr1::arrayor boost::array,具体取决于您的编译器。

于 2010-11-23T18:26:28.210 回答
2

为什么不使用std::vector,并利用它的构造函数

std::vector<std::vector<int> > my2Darray(2, std::vector<int>(10));
my2Darray[0][0] = 2;
于 2010-11-23T14:21:44.053 回答
1

需要有一个循环,因为您需要为每一列创建一个数组。

我想你追求的是:

double *myArray[numC];
for (int i = 0; i < numC; i++) {
    myArray[i] = new double[numR];
}

// some code...

// Cleanup:
for (int i = 0; i < numC; i++) {
    delete [] myArray[i];
}

这声明了一个带有元素的指针数组 (to double) ,然后为 中的每一列numC创建一个double包含元素的 s数组。完成后不要忘记释放内存,否则会发生内存泄漏。numRmyArray

于 2010-11-23T14:20:29.997 回答
-1

您的索引应该是行,然后是列。

double** myArray = new double*[numR];
for( unsigned int i = 0; i < numR; i++ ) {
    myArray[i] = new double[numC];
}

访问第 2 行第 5 列:

myArray[2][5];
于 2010-11-23T14:21:55.363 回答