2012-01-06 53 views
2

这应该很简单,但事实并非如此。如何在D中创建2D数组?

import std.container, std.stdio; 

void main(){ 

    alias Array!double _1D; 
    alias Array!_1D _2D; 

    _1D a = _1D(); 
    _2D b = _2D(); 
    a.insert(1.2); 
    a.insert(2.2); 
    a.insert(4.2); 
    b.insert(a); 
    writeln(b[0][]); // prints [1.2, 2.2, 4.2], then throws exception 

    _2D c = _2D(); 
    c.insert(_1D()); 
    c[0].insert(3.3); 
    c[0].insert(2.2); 
    c[0].insert(7.7); 
    writeln(c[0][]); // prints [] 
} 
+0

看起来像一个bug给我。 – Trass3r 2012-01-06 14:06:31

回答

2

我被this question避让到声明一个动态数组的大小在预先的另一种方法如下:

auto matrix = new double[][](3, 2); // elements can be appended/removed 

虽然有各种不同的方法来做到这一点取决于如何任意你想添加元素。当然你要选择哪种风格最适合你的程序,但这里有一些可能性:

double[][] matrix = [[1.1, 1.2], [2.3, 2.4], [3.5, 3.6]]; 

double[][] matrix; 
matrix ~= [1.1, 1.2]; 
matrix ~= [2.3, 2.4]; 
matrix ~= [3.5]; 
matrix[2] ~= 3.6; 

double[][] matrix = new double[][](1,0); 
matrix[0].length = 2; 
matrix[0][0] = 1.1; 
matrix[0][1] = 1.2; 

++matrix.length; 
matrix[1] ~= 2.3; 
matrix[1] ~= 2.4; 

matrix ~= new double[](0); 
matrix[$-1] ~= [3.5, 3.6]; 

最后,如果你知道你的数组在编译时的大小,它不会改变,你可以创建一个静态数组:

double[2][3] staticMatrix;   // size cannot be changed 

虽然这些都使用自然的内建数组机制。是否有一个特定的原因需要使用Array容器类?

+0

在我看来,他似乎并不是在质疑任何事情。他只是问你是否有使用阵列的具体原因...向下投票太过于苛刻恕我直言。 – DejanLekic 2012-01-07 11:40:25

+0

@DejanLekic回应是他没有回答这个问题。内置数组和Array之间有很大的区别。 – Arlen 2012-01-07 23:18:19

+0

当然是有区别的......这是你的权利,是降低是的,但我相信不投票是足够的惩罚。 :) – DejanLekic 2012-01-08 11:03:09