您的位置:首页 > 编程语言 > Go语言

GTK Gossip: GHashTable

2010-12-10 15:23 295 查看
GHashTable可以讓您以雜湊表的方式來儲存資料,儲存時指定Key演算出Hash值以決定資料儲存位置,要取回資料,也是指定Key演算出資料儲存位置,以快速取得資料。

簡單的說,您將GHashTable當作一個有很多間房間的房子,每個房間的門有一把鑰匙,您將資料儲存至房間中時,要順便擁有一把鑰匙,下次要取回資料時,就是根據這把鑰匙取得。

您可以使用g_hash_table_new()來建立GHashTable:

GHashTable* g_hash_table_new(GHashFunc hash_func,

GEqualFunc key_equal_func);

g_hash_table_new()要指定一個演算Hash值的函式,GLib提供了如g_int_hash()、g_str_hash()函式可以直接使用,您也可以自訂自己的演算Hash值的函式,例如:

guint hash_func(gconstpointer key) {

...

return ...;

}

演算出Hash是決定儲存的位置,接下來要確認Key的相等性,GLib提供了如g_int_equal()及g_str_equal()函式可直接使用,同樣的,您也可以自訂函式:

gboolean key_equal_func(gconstpointer a, gconstpointer b) {

...

return ...;

}

下面這個程式是個簡單的示範:

ghashtable_demo.c

#include <glib.h>

int main(int argc, char *argv[]) {

GHashTable *hashTable = g_hash_table_new(

g_str_hash, g_str_equal);

g_hash_table_insert(hashTable, "caterpillar", "caterpillar's message!!");

g_hash_table_insert(hashTable, "justin", "justin's message!!");

g_print("%s/n", g_hash_table_lookup(hashTable, "caterpillar")
);

g_print("%s/n", g_hash_table_lookup(hashTable, "justin")
);

g_hash_table_destroy(hashTable);

return 0;

}


程式的執行結果如下:

justin's message!!

caterpillar's message!!

以下則示範如何使用g_hash_table_iter_next()函式來進行GHashTable的迭代:

ghashtable_demo.c

#include <glib.h>

int main(int argc, char *argv[]) {

GHashTableIter iter;

gpointer key, value;

GHashTable *hashTable;

hashTable = g_hash_table_new(g_str_hash, g_str_equal);

g_hash_table_insert(hashTable, "justin", "justin's message!!");

g_hash_table_insert(hashTable, "momor", "momor's message!!");

g_hash_table_insert(hashTable, "caterpillar", "caterpillar's message!!");

g_hash_table_iter_init (&iter, hashTable);

while(g_hash_table_iter_next(&iter, &key, &value)) {

g_print("key/t: %s/nvalue/t: %s/n/n", key , value);

}

g_hash_table_destroy(hashTable);

return 0;

}


程式的執行結果如下:

key : justin

value : justin's message!!

key : caterpillar

value : caterpillar's message!!

key : momor

value : momor's message!!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: