我在 C 中有一些代码,我想在其中使用 int 作为键和 gnome 哈希表中的值。但如果我写:
GHashTable* table = g_hash_table_new(g_direct_hash, g_direct_equal);
int tmp = 0;
int value = 255;
g_hash_table_insert(table, (gpointer)tmp, (gpointer) 255);
我收到一些关于从不同大小的整数转换指针和应用程序返回段错误的警告。我知道这可以通过指针来完成,但我想知道是否有办法直接使用 int 来优化过程。我也愿意尝试性能更好的新解决方案(总是在 C 中使用 gnome 哈希表)。我只需要创建一个哈希表并为一定数量的键填充相同的值,然后在稍后阶段与其中的值进行一些比较,最后将其中的每个值与固定值进行比较。
最佳答案
你有两个选择:
- 使用
g_direct_hash()
和GINT_TO_POINTER()
键;或 - 将
g_int_hash()
与指向整数键的指针一起使用。
所以在第一种情况下,那就是:
int tmp = 0;
int value = 255;
GHashTable *table = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, NULL);
g_hash_table_insert (table, GINT_TO_POINTER (tmp), GINT_TO_POINTER (value));
第二个是:
int tmp = 0;
int value = 255;
GHashTable *table = g_hash_table_new_full (g_int_hash, g_int_equal, NULL, NULL);
g_hash_table_insert(table, &tmp, GINT_TO_POINTER (value));
虽然您必须保证 &tmp
指向的键在其条目位于哈希表中时不会更改 - 所以这只适用于分配的键,如下所示:
int tmp = 0;
int *key = g_new0 (gint, 1);
*key = tmp;
int value = 255;
GHashTable *table = g_hash_table_new_full (g_int_hash, g_int_equal, g_free, NULL);
g_hash_table_insert(table, key, GINT_TO_POINTER (value));
所以第二个选项更有意义,例如,如果您想根据现有堆分配结构中的整数字段的值来键入哈希表,该结构将作为值存储在哈希表条目中 (所以你不需要为 key 额外分配)。
请注意,在这两种情况下,您都对要存储的值使用 GINT_TO_POINTER()
,因为值始终被视为指针,并且与您使用的哈希和相等函数无关。
另请注意,使用 g_hash_table_new_full()
并为最后两个参数传递 NULL
(除了在第三个示例中)可以更清楚地表明哈希表不拥有您传递给它的键和值的所有权。 (最后两个参数给出了键和值的自由函数。)
关于c - 在 g_hash_table 中使用 int 作为键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42295821/