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");
}
相關文章
相關標籤/搜索