有没有一种方法可以将结构索引为 Glib 哈希表中的值?
Is there a way of indexing structures as values in Glib Hash Tables?
目前我正在尝试实现一个带有范围管理的符号表,用于将自定义语言解释为一门学校 project.My 问题是我对实现图书馆的知识知之甚少 containers.I 已经研究过油嘴滑舌了一段时间,我决定成为最合适的人选,我正在尝试将它用于我的 cause.But 我有一个问题是有没有一种方法可以使用结构作为键的值?
"using structs as value for keys"让我很困惑,你是说"using structs as keys"还是"using structs as values"?
您可以使用任何指针作为键或值; gpointer
是 void*
的类型定义。作为值的结构类似于
YourStruct* your_struct_new(void) {
YourStruct* val = g_malloc0(sizeof(YourStruct));
/* Any per-struct initialization goes here */
return val;
}
void your_struct_free(YourStruct* val) {
/* Free any members you need to */
g_free(val);
}
void do_stuff(void) {
GHashTable* ht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, your_struct_free);
/* Insert an entry */
g_hash_table_insert(ht, g_strdup("Key"), your_struct_new());
/* Free the hash table, including all entries */
g_hash_table_unref(ht);
}
作为键的结构可能需要自定义 hash/equal 函数,除非您只想使用仅使用内存地址的 g_direct_hash
。通常这就足够了,但如果不够,您基本上需要以某种方式从结构的内容生成一个 int。例如,如果您的结构有两个字符串成员,您可能需要
typedef struct {
char* foo;
char* bar;
} YourStruct;
guint your_struct_hash(YourStruct* val) {
guint res = g_str_hash(val->foo);
res |= g_str_hash(val->bar);
return res;
}
/* return TRUE if a and b are equal, FALSE otherwise */
gboolean your_truct_equals(YourStruct* a, YourStruct* b) {
if (g_strcmp0(a->foo, b->foo))
return FALSE;
if (g_strcmp0(a->bar, b->bar))
return FALSE;
return TRUE;
}
然后只需将它们传递给 g_hash_table_new_full
而不是 g_str_hash
和 g_free
即可。当然,具体如何实现这些在很大程度上取决于你的数据结构是什么样的,所以没有更多信息,我只能告诉你。
目前我正在尝试实现一个带有范围管理的符号表,用于将自定义语言解释为一门学校 project.My 问题是我对实现图书馆的知识知之甚少 containers.I 已经研究过油嘴滑舌了一段时间,我决定成为最合适的人选,我正在尝试将它用于我的 cause.But 我有一个问题是有没有一种方法可以使用结构作为键的值?
"using structs as value for keys"让我很困惑,你是说"using structs as keys"还是"using structs as values"?
您可以使用任何指针作为键或值; gpointer
是 void*
的类型定义。作为值的结构类似于
YourStruct* your_struct_new(void) {
YourStruct* val = g_malloc0(sizeof(YourStruct));
/* Any per-struct initialization goes here */
return val;
}
void your_struct_free(YourStruct* val) {
/* Free any members you need to */
g_free(val);
}
void do_stuff(void) {
GHashTable* ht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, your_struct_free);
/* Insert an entry */
g_hash_table_insert(ht, g_strdup("Key"), your_struct_new());
/* Free the hash table, including all entries */
g_hash_table_unref(ht);
}
作为键的结构可能需要自定义 hash/equal 函数,除非您只想使用仅使用内存地址的 g_direct_hash
。通常这就足够了,但如果不够,您基本上需要以某种方式从结构的内容生成一个 int。例如,如果您的结构有两个字符串成员,您可能需要
typedef struct {
char* foo;
char* bar;
} YourStruct;
guint your_struct_hash(YourStruct* val) {
guint res = g_str_hash(val->foo);
res |= g_str_hash(val->bar);
return res;
}
/* return TRUE if a and b are equal, FALSE otherwise */
gboolean your_truct_equals(YourStruct* a, YourStruct* b) {
if (g_strcmp0(a->foo, b->foo))
return FALSE;
if (g_strcmp0(a->bar, b->bar))
return FALSE;
return TRUE;
}
然后只需将它们传递给 g_hash_table_new_full
而不是 g_str_hash
和 g_free
即可。当然,具体如何实现这些在很大程度上取决于你的数据结构是什么样的,所以没有更多信息,我只能告诉你。