欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > c语言中GHashTable的使用

c语言中GHashTable的使用

2025/1/7 3:21:18 来源:https://blog.csdn.net/m0_58103115/article/details/144905209  浏览:    关键词:c语言中GHashTable的使用

前言:最近在c代码中需要用到键值对的存储,由于没有map,需要自己实现或者使用库函数,g_hash_table_new是GLib中的库函数,但使用起来会有很多坑,记录一下

构建hash表g_hash_table_new

GHashTable* g_hash_table_new(GHashFunc hash_func, GCompareFunc key_equal_func);

hash_func(GHashFunc 类型)
这是一个哈希函数,用于根据键的值计算哈希码。哈希函数应该返回一个整数,这个整数将作为键的哈希值
常见的有
需要注意的是,存储都是以指针类型存储,存储的是个地址,查找时候也会根据传入的地址查找

guint g_str_hash(const gchar *str);
guint g_int_hash(const gint *value);
guint g_double_hash(const gdouble *value);

key_equal_func(GCompareFunc 类型)
这是一个比较函数,用于比较两个键是否相等。它应该返回一个整数值,如果返回值为 0,表示两个键相等;如果返回值为非零值,则表示键不相等。
常见的有

gboolean g_int_equal(const gint *a, const gint *b);
gboolean g_str_equal(const gchar *a, const gchar *b);
gboolean g_double_equal(const gdouble *a, const gdouble *b);

hash插入g_hash_table_insert

g_hash_table_insert() 只会替换旧的值,而不会替换键。如果键已经存在,它会更新与该键相关联的值;如果键不存在,它会插入新的键值对

gboolean g_hash_table_insert(GHashTable *hash_table, gconstpointer key, gpointer value);

hash查找g_hash_table_lookup

如果哈希表中存在与给定键匹配的键值对,g_hash_table_lookup() 返回指向该值的指针。
如果哈希表中没有与给定键匹配的键值对,g_hash_table_lookup() 返回 NULL

gpointer g_hash_table_lookup(GHashTable *hash_table, gconstpointer key);

使用过程中的问题

我有这样一组数据

Physical Curve(1) = {2, 6, 7, 11, 3, 4, 9, 11};
Physical Curve(2) = {5, 1};
Physical Curve(3) = {10};

在读取的时候我希望他能插入到hash表以便我后续对{}中的内容进行枚举定义,期望的key->value是

2->1
6->1
...
5->2
...
10->3

在插入的过程中我这样插入

key = 2;
value = 1;
g_hash_table_insert(physical_curve_table, &key, &value);

结果发现我在查找的时候使用对应的key找不到value的值

int id = 2;
g_hash_table_lookup(physical_curve_table, &id);

原因:在插入的过程中由于我的key和value是局部遍历,在我走到查询的时候已经被销毁(推测是地址被重新使用)导致找不到对应的value

解决方法:插入的时候为key,value开辟空间,但是查找并不需要,还是按照原来的方法(应该是比对的之前存储地址对应的值和我当前的值,没有深究,问题得到解决)
可以正常存储并查找<int,int>类型的键值对

key = 2;
value = 1;
int *key_ptr = g_malloc(sizeof(int));
*key_ptr = key;
int *value_ptr = g_malloc(sizeof(int));
*value_ptr = value;g_hash_table_insert(plane_surface_table, key_ptr, value_ptr);
int id = 2;
g_hash_table_lookup(physical_curve_table, &id);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com