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
程式的執行結果如下:
以下則示範如何使用g_hash_table_iter_next()函式來進行GHashTable的迭代:
ghashtable_demo.c
程式的執行結果如下:
簡單的說,您將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!! |
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!! |
相关文章推荐
- GTK Gossip: Windows 下第一個 GTK 程式
- GTK Gossip: GtkCheckButton 與 GtkRadioButton
- GTK Gossip: GtkPaned
- GTK Gossip: GTK 的物件導向架構
- GTK Gossip: GtkMessageDialog
- GTK Gossip: GtkAlignment、GtkFixed 與 GtkLayout
- GTK Gossip: GtkDrawingArea
- GTK Gossip: 使用 Signal 关闭视窗
- GTK Gossip: GLib 基本型態與巨集
- GTK Gossip: 自訂 callback 函式
- GTK Gossip: GtkColorButton 與 GtkColorSelectionDialog
- GTK Gossip: GtkHandleBox
- GTK Gossip: GTimer
- GTK Gossip: 內建 Signal 的發射與停止
- GTK Gossip: GtkFontButton 與 GtkFontSelectionDialog
- GTK Gossip: GtkMenuBar、GtkMenu 與 GtkMenuItem
- GTK Gossip: 環境資訊
- GTK Gossip: GDK 事件結構
- GTK Gossip: GtkFileChooserButton 與 GtkFileChooserDialog
- GTK Gossip: 日誌(Logging)