在 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 不拥有您传递给它的键和值。 (最后两个参数给出键和值的自由函数。)
我在 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 不拥有您传递给它的键和值。 (最后两个参数给出键和值的自由函数。)