2012-01-06 7 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

私にはバグのようです。 – Trass3r

答えて

2

私は事前に動的配列のサイズを宣言するthis questionによりにcluedたもう一つの方法は次のとおりです。

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

彼は何も質問していないように私には思われません。彼は単純にArrayを使用する特定の理由があるかどうか尋ねました...ダウン投票はあまりにも厳しいIMHOです。 – DejanLekic

+0

@DejanLekic下院議員は、彼が質問に答えなかったためだった。組み込み配列と配列には大きな違いがあります。 – Arlen

+0

確かに違いがあります...はいをdownvoteする権利ですが、私は議決が十分な罰ではないと信じています。 :) – DejanLekic

関連する問題