前言:最近在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);