在 g_hash_table 中使用 int 作为键

Using int as key in g_hash_table

我在 C 中有一些代码,我想将 int 用作 gnome 散列 tables 中的键和值。但是如果我写:

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);

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

你应该使用 GINT_TO_POINTER 宏:

g_hash_table_insert(table, GINT_TO_POINTER(tmp), GINT_TO_POINTER(255));  

这将允许摆脱 warning: cast to pointer from integer of different size 警告。

您有两个选择:

  • 使用 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 指向的键在它的条目在散列 table 中时不会改变——所以这只适用于分配的键,像这样:

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));

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

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

另请注意,使用 g_hash_table_new_full() 并传递 NULL 作为最后两个参数(除了第三个示例)可以更清楚地表明散列 table 不拥有您传递给它的键和值。 (最后两个参数给出键和值的自由函数。)