2011-12-22

D 筆記 -- 組合陣列(Associative Arrays)

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

組合陣列明顯地與靜態、動態陣列不同,它可以讓你用整數以外的型態來當作索引。它可以用來掌握特定型泰的內容且需要有關鍵字(key)。D的組合陣列類似其它語言的hash maps,屬於原生動態且總是活動於堆積之內。

宣告方式看起來如下:
int[char[]] x;
float[double] y;
char[][char[]] z;

第一行是宣告整數型態內容而使用字元型態作為索引的組合陣列
第二行是浮點型態內容而使用雙倍浮點索引的組合陣列
第三航則是字元型態內容而使用字元索引的組合陣列

宣告之後,使用的方式為
aa[key] = value; 

如果該key關聯處已有既存內容,將會被取代。而要取用內容時,可以用這樣的語法
value=aa[key];

如果索引並不存在,D執行模組將會給出錯誤訊息表示陣列索引被超出(array index is out of bounds)。

組合陣列特有的屬性如下:

length組合陣列的內容數量,如同靜態陣列是唯讀
keys組合陣列內涵蓋全部索引的動態陣列
value組合陣列內涵蓋所有內容的動態陣列
rehash在空間中重組組合陣列使其更有效率並傳回新陣列

由於組合陣列的限制,它無法在不增加或移除索引/內容的數量下來改變它,所以length屬性是唯讀。rehash屬性是個需要付出代價的操作,但可以讓大量的索引作業起來更有效率。

組合陣列有兩個比較特別的操作方式:

in這可在當內容決定要賦予給某特定索引後進入組合陣列。這在避免覆蓋已存在的索引上非常好用。因為in在內容存在時會傳回指標,反之傳回null。
remove它用來把特定索引及內容從組合陣列內移除。

而以下是個範例:
int[char[]] aa;
aa["One"] = 1;
int x = aa["One"];
int *y = ("Two" in aa);
if (y is null)
{
    aa["Two"]=2;
}
aa.remove("One");


沒有留言: