在 g_hash_table 中使用 int 作为键

3 c hashtable glib

我在 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);
Run Code Online (Sandbox Code Playgroud)

我收到一些关于从不同大小的整数转换指针的警告,并且应用程序返回分段错误。我知道这可以通过指针来完成,但我想知道是否有办法直接使用 int 来优化过程。我也愿意尝试性能更好的新解决方案(总是在 C 中使用 gnome 哈希表)。我只需要创建一个哈希表并为一定数量的键填充相同的值,然后在后期与其中的值进行一些比较,最后将其中的每个值与固定值进行比较。

Phi*_*all 5

您有两个选择:

  • 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));
Run Code Online (Sandbox Code Playgroud)

在第二个,它是:

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));
Run Code Online (Sandbox Code Playgroud)

尽管您必须保证指向的键&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));
Run Code Online (Sandbox Code Playgroud)

因此,第二个选项更有意义,例如,如果您想根据现有堆分配结构中的整数字段的值对哈希表进行键值,该值将作为哈希表条目中的值存储(因此您不需要不需要只为密钥进行额外分配)。

请注意,在这两种情况下,您都使用GINT_TO_POINTER()要存储的值,因为值始终被视为指针,并且独立于您使用的散列和相等函数。

另请注意,使用g_hash_table_new_full()和传递NULL最后两个参数(第三个示例除外)更清楚地表明哈希表不拥有您传递给它的键和值的所有权。(最后两个参数给出了键和值的自由函数。)