配列

Last-modified: 2011-09-15 (木) 12:55:32

配列を構築する

int[]  ary;             // サイズ可変の配列を宣言
int[5] sary;            // サイズ固定の配列を構築
int[]  ary = [ 0,1,2 ]; // 初期値を指定する場合

[0,1,2]のカッコに注意(CやJavaと異なる)


・int ary[]; という記法もC言語からの移植性のため残されているが、
多次元配列の宣言にて順序によるふるまいの違いが生じるというクセ者

int[3][2] ary1 = [[1,2,3],[4,5,6]]; // 変数の前に添え字(Dで推奨される記法)
int ary2[2][3] = [[1,2,3],[4,5,6]]; // 変数の後に添え字(C言語と同じ記法)
assert(ary1 == ary2);
assert(ary1[1][2] == 6);            // 宣言時と逆順に記述
assert(ary2[1][2] == 6);            // 宣言時と同順に記述

宣言時の添え字の順序に注意

配列の要素数を取得・変更する

int n = ary.length;     // サイズ取得
ary.length = 5;         // サイズ可変の配列のサイズ変更方法

【補足】
[ ]内のみ、$を使用できる

a[0..$-1];              // a[ 0..a.length-1 ]; と同じ意味。

配列同士を比較する

int[] array = [1,2,3];
assert(array == [1,2,3]);// 配列内の要素を比較

配列の一部を取得・変更する

配列同士はコピーをせず参照をつくるだけなので必要に応じて.dupを追加すべし

int a = ary[0];         // 配列の先頭の要素(C言語と同じ)
int[] newary = ary[2..4]; // ary[2],ary[3]の内容をもつサイズ2の配列
int[] newary = ary[2..4].dup; // ary[2],ary[3]の内容をもつサイズ2の配列をコピーして作成
ary[0..ary.length] = 0; // こうすると配列の要素全部を0にできる
ary[] = 0;              // これも配列の要素全部を0にできる

配列から配列へコピーする

int[] s = [1,2,3];
int[] d;
d = s;     // d は s の参照
d[] = s[]; // d は s をコピーして作られた配列

【注意】同一配列内でコピー元を上書きするようなコピーは禁止

a[0..$-1] = a[1..$]; // 実行時エラー

配列に要素を追加する

~(チルダ)を使う

ary ~= item;            // 1個追加
ary = ary1 ~ ary2;      // 配列と配列を結合

配列から要素を削除する

ary = ary[0..2]~ary[2+1..ary.length]; // ary[2]を削除

もっといいやり方ないの?

↓もっといいやり方

import std.algorithm;
auto ary = [0, 1, 8, 2, 3];
ary = ary.remove(2);
assert (ary == [0, 1, 2, 3]);

内部ではコピーで指定インデクスの値を埋めて、スライスを返してる。
新しい配列を作らないぶん、上より効率もいい。

ary = remove!("a == 8")(ary);

↑こういうこともできる。

配列内の要素を検索・取得する

→ もしかして:連想配列

配列内の要素1つ1つに対応するループ処理

foreach (idx,item; ary) { // int idx, T item が foreachスコープで宣言される
   assert(item == ary[idx]);
}
foreach (item; ary) {    // idx が必要ないなら
}
foreach (ref obj; ary) { // ary が保持する内容に変更を加えたい場合 【ref】を 忘れずに
   obj = new ClassX();
}