参考自d程序设计语言---我的博客http://my.oschina.net/u/218155/blog?fromerr=SwOkb7Sw fllow me
在D语言中的数组是胖指针。 头指针+长度 或者头指针+尾指针
在D语言中动态数组和静态数组会有一点不同。
定义一个动态数组
1int[] arr = new int[10]; 2auto arr = new int[10];
动态数组的长度
arr.length
动态数组的复制,动态数组复制会引用同一副本,
1auto arr2 = arr; 2arr2[1] = 12; 3assert(arr1[1] == 12); 4assert(arr1 is arr2);//比较引用,指向同一副本 5assert(arr1 == arr2);//比较内容
如果需要产生新的动态数组
1auto arr3 = arr.dup; 2assert(arr1 !is arr3);//arr1 和arr3不指向同一副本 3assert(arr1 == arr3); //arr1 和arr3的值相同 4arr3[1] = 13; 5assert(arr1[1] != 13);
动态数组的分割,分割后的数组还是引用原数组的数据段,例如
1auto arr4 = arr1[$/2 .. $]; 2arr4[0] = 1; 3assert(arr4[0] == arr1[$/2]);
数组的拼接,数组拼接后会产生新的数组
1int[] arr = [1,2,4]; 2int[] arr2 = arr ~ 11; 3arr2[0] = 11; 4assert(arr[0] != arr2[0]);
数组有个很重要的功能,支持表达式
1 分割我们提过了 [m..n]
2 ~连接, + - * 、 % ^ & ~ = += -= *= /= %= ^= &= |=
1int[] arr = [1,2,4]; 2int[] arr2 = [13,23,43]; 3auto arr3 = new int[3]; 4arr3[] = arr[] + arr2[]; 5assert(arr3==[14,25,47]);
数组扩张和收缩
1arr ~= 13; 2arr.length = 100; 3arr[1..$-1];
数组的循环
1auto arr= [1,2,3]; 2foreach(v;arr) writeln(v); 3//修改值 4foreach(ref v:arr){ 5 v += 1; 6} 7assert(arr = [2,3,4]);
固定数组
1int arr[3] = [1,2,3]; 2assert(arr.length == 3);
数组的边界检查,越界会报错,
通过模式可以设置是否报错 后面我们单独讨论他们。
静态数组分割会产生动态数组
int[] arr2 = arr[1..2];
静态数组的复制和动态数组不同,他们的复制会产生不同的副本
1int arr[3] = [1,2,3]; 2int arr2[3] = arr3; 3assert(arr !is arr2);
静态数组的拼接会产生静态数组
1int arr[3] = [1,2,3]; 2int arr2[4] = arr ~ 12; 3int arr3[] = arr2 ~ 13;
多维数组,和其他语言没什么不同的,不再赘述。
关联数组
1int[string] arr = ["a":1,"b":2];//定义 2assert(arr.length);//长度 3arr["k"] = 3;//赋值 4assert(arr.get("adb",13)== 13);//读取 5assert(arr==["a":1,"b":2,"k":3]); 6arr.remove("k");//移除 7//通过foreach 迭代 8foreach(k,v;arr){ 9 write(k,"=>",v,"\t"); 10}