2011-12-21

D 筆記 -- 靜態陣列 & 動態陣列


主要是參考Learn to Tango with D的內容,把我想記下來的部份寫在這…



D可以使用靜態陣列與動態陣列,基本上靜態陣列的屬性參數如下

length陣列元素數量,無法修改
ptr陣列第一個元素的指標
dup建立且傳回一動態陣列,內容是原陣列相同
reverse將陣列內容在空間中反轉並傳回
sort將陣列內容在空間中排序並傳回

雖然這些屬性可以讓程式寫作更加方便,但用在大陣列上時需要注意對效率的衝擊。



不同於靜態陣列在編譯時就知道其大小(或長度),動態陣列是被放置在堆積(heap)上。主要是因為陣列的大小還未固定,以便讓動態陣列可在必要時改變其大小。先前所看到的陣列屬性都仍是唯讀,但是length卻變成可以寫入。

所以要改變陣列大小最簡便的方式就是設定陣列的length屬性。無論動態陣列是透過new或者是length來取得大小,它隨時都可以改變。但無論你怎樣增添變動,當新的length比原有數值大,會自動增加長度來提供必要的空間。但如果新值較原有值小時,就不會進行更動。

陣列的運算子

切割
基本上它並不複製任何陣列資料,只簡單建立一個新的陣列參考來分享既存陣列的某部份。所以也可以說是相同數據的不同面向。
a[start..end]
如果你切割整個陣列,你可以使用[],不需要指定起始與結尾。
int x[]=[0, 1, 2, 3, 4];
int y[] = x[1..x.length];

int z[];
z=x[1..x.length-1];
int all=x[];
複製

D支援三種複製方式
  • 手動取得陣列內容並且指定到另一相同長度的陣列內。這非常沒有效率。
  • 使用動態與靜態陣列的dup屬性
  • 使用切割運算子([])

int[] x = [0, 1, 2, 3, 4];
int[] y = x;
int[] z = x[];
y[0..2]=x[1..3];

關聯(Concatenation)

D可以使用~來作為陣列關聯使用。它可適用於所有陣列,但最常用在字串上。也可以使用~=運算子,可以把某陣列在空間中附加到另一陣列後。

char[] x = "Hello"; 
char[] y = "World"; 
char[] z = x ~ " " ~ y;    
 
int[] a = [0, 1, 2, 3]; 
int[] b = [4, 5]; 
a ~= b;


這裡要來討論一下堆疊(stack)與堆積的不同。堆疊(Stack)和堆積(Heap) 是存放資料的記憶體分成兩種不同的管理機制。


堆疊可以想像成一個一個疊起來的盒子,數值型別的變數就一個一個放在盒子內。當變數生命周期結束時,盒子就會被移走。堆積就像一個空地內亂七八糟的擺了一堆盒子,然後盒子上有標明這個盒子目前是屬於誰在使用的(可以很多人使用同一個盒子)。每當new 出一個物件,物件參照就擺放在堆疊中的盒子裡,而new出來的物件就在堆積中找一個沒人用的空盒子來擺。當物件的生命周期結束,也就是沒人使用時,堆積中的盒子就會被註明為沒人使用,系統會不定時的把沒人使用的盒子清空。

沒有留言: