为什么不能在C++中使用一个新调用分配多维数组?

Cal*_*ius 5 c++ standards

在C++中,您可以轻松地分配一维数组,如下所示:

T *array=new T[N];
Run Code Online (Sandbox Code Playgroud)

你也可以用一个语句删除它:

delete[] array;
Run Code Online (Sandbox Code Playgroud)

编译器将知道如何解除分配正确的字节数的魔力.

但为什么不能像这样分配二维数组呢?

T *array=new T[N,M];
Run Code Online (Sandbox Code Playgroud)

或者甚至喜欢这个?

T *array=new T[N,M,L];
Run Code Online (Sandbox Code Playgroud)

如果你想要一个多维度,你必须这样做:

T **array=new T*[N];
for(int i=0;i<N;i++) array[i]=new T[M];
Run Code Online (Sandbox Code Playgroud)

如果你想要一个使用矩阵的快速程序(矩阵运算,特征值算法等等),你可能也希望利用缓存来获得最佳性能,这需要数据在同一个地方.使用vector<vector<T> >是相同的情况.在C中,您可以在堆栈上使用可变长度数组,但是您无法在堆上分配它们(并且堆栈空间非常有限),您也可以在C++中执行可变长度数组,但它们不会出现在C中++ 0x中.

唯一的解决方法是相当hackish和错误 - 错误:

T *array=new T[N*M];
for(int i=0;i<N;i++)
   for(int j=0;j<M;j++)
   {
       T[i*N+j]=...;
   }
Run Code Online (Sandbox Code Playgroud)

cas*_*nca 8

您的工作方式T *array=new T[N*M];是最接近真正的多维数组.请注意,要找到此数组中的元素,您需要M(我相信您的示例是错误的,它应该是T[i*M+j])的值,这只在运行时才知道.

例如array[5][10],在编译时分配2D数组时,该值10是常量,因此编译器只生成要计算的代码i*10+j.但是如果你这样做new T[N,M],表达式i*M+j取决于M分配数组时的值.编译器需要一些方法来存储M实际数组本身的值,而事情只会从这里变得混乱.我想这就是为什么他们决定不在语言中加入这样的功能.

至于你的解决方法,你可以通过编写一个重载的包装类来减少"hackish" operator (),这样你就可以做类似的事情了array(i, j) = ....