D语言之数组

参考自d程序设计语言---个人博客http://my.oschina.net/u/218155/blog?fromerr=SwOkb7Sw fllow me数组

 在D语言中的数组是胖指针。 头指针+长度 或者头指针+尾指针 spa

在D语言中动态数组和静态数组会有一点不一样。.net

定义一个动态数组设计

int[] arr = new int[10];
auto arr = new int[10];

动态数组的长度指针

arr.length

动态数组的复制,动态数组复制会引用同一副本,code

auto arr2 = arr;
arr2[1] = 12;
assert(arr1[1] == 12);
assert(arr1 is arr2);//比较引用,指向同一副本
assert(arr1 == arr2);//比较内容

若是须要产生新的动态数组orm

auto arr3 = arr.dup;
assert(arr1 !is arr3);//arr1 和arr3不指向同一副本
assert(arr1 == arr3); //arr1 和arr3的值相同
arr3[1] = 13;
assert(arr1[1] != 13);

动态数组的分割,分割后的数组仍是引用原数组的数据段,例如blog

auto arr4 = arr1[$/2 .. $];
arr4[0] = 1;
assert(arr4[0] == arr1[$/2]);

数组的拼接,数组拼接后会产生新的数组rem

int[] arr = [1,2,4];
int[] arr2 = arr ~ 11;
arr2[0] = 11;
assert(arr[0] != arr2[0]);

数组有个很重要的功能,支持表达式get

   1 分割咱们提过了 [m..n]

    2 ~链接, + - * 、 % ^ & ~ = += -= *= /= %= ^= &= |=

int[] arr = [1,2,4];
int[] arr2 = [13,23,43];
auto arr3 = new int[3];
arr3[] = arr[] + arr2[];
assert(arr3==[14,25,47]);

数组扩张和收缩

arr ~= 13;
arr.length = 100;
arr[1..$-1];

数组的循环

auto arr= [1,2,3];
foreach(v;arr) writeln(v);
//修改值
foreach(ref v:arr){
    v += 1;
}
assert(arr = [2,3,4]);

固定数组

int arr[3] = [1,2,3];
assert(arr.length == 3);

数组的边界检查,越界会报错,

D语言有三种模式@safe @system @trust。

经过模式能够设置是否报错 后面咱们单独讨论他们。

静态数组分割会产生动态数组

int[] arr2 = arr[1..2];

静态数组的复制和动态数组不一样,他们的复制会产生不一样的副本

int arr[3] = [1,2,3];
int arr2[3] = arr3;
assert(arr !is arr2);

静态数组的拼接会产生静态数组

int arr[3] = [1,2,3];
int arr2[4] = arr ~ 12; 
int arr3[] = arr2 ~ 13;

多维数组,和其余语言没什么不一样的,再也不赘述。

关联数组

int[string] arr  = ["a":1,"b":2];//定义
assert(arr.length);//长度
arr["k"] = 3;//赋值
assert(arr.get("adb",13)== 13);//读取
assert(arr==["a":1,"b":2,"k":3]);
arr.remove("k");//移除
//经过foreach 迭代
foreach(k,v;arr){
    write(k,"=>",v,"\t");
}
相关文章
相关标签/搜索