2014年02月06日 星期四 10:40
我期待C语言标准库在下一个版本中加入Hash Tables数据结构,因为这个数据结构的需求太多了。GLib库提供了一组Hash Tables的实现,编程示例如下:
#include <stdio.h>
#include <glib.h>
#include <string.h>
#include <stdlib.h>
void my_free(gpointer data) {
GString *s=(GString *)data;
printf("freeing: %s\n",s->str);
g_string_free(s,TRUE);
return;
}
void g_hash_table_print_gstring(
gpointer key,gpointer val,gpointer user_data) {
GString *skey=(GString *)key;
GString *sval=(GString *)val;
printf("%s => %s\n",skey->str,sval->str);
return;
}
guint my_hash(gconstpointer key){
return g_string_hash((GString *)key);
}
gboolean my_equal(gconstpointer a, gconstpointer b) {
return g_string_equal((GString *)a,(GString *)b);
}
int main(int argc,char **argv) {
GHashTable *ht=g_hash_table_new(g_str_hash,g_str_equal);
g_hash_table_destroy(ht);
ht=g_hash_table_new_full(my_hash,my_equal,my_free,my_free);
GString *key,*val;
key=g_string_new("laomeng");
val=g_string_new("laomeng188@163.com");
g_hash_table_insert(ht,key,val);
key=g_string_new("laozhang");
val=g_string_new("laozhang@163.com");
g_hash_table_insert(ht,key,val);
key=g_string_new("laoli");
val=g_string_new("laoli@qq.com");
g_hash_table_insert(ht,key,val);
g_hash_table_foreach(ht,g_hash_table_print_gstring,NULL);
g_hash_table_remove_all(ht);
g_hash_table_destroy(ht);
return 0;
}
需要注意的是,与C++ STL容器不同,GLib的Hash Tables在插入数据时,不会对key、value数据进行复制,用户需要自己维护这部分内存。
参考资料:
Zeuux © 2025
京ICP备05028076号