C Programer  - 讨论区

标题:GLib库Hash Tables模块编程示例

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数据进行复制,用户需要自己维护这部分内存。

参考资料:

https://developer.gnome.org/glib/2.39/glib-Hash-Tables.html

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号