c - 在 g_hash_table 中使用 int 作为键

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

我收到一些关于从不同大小的整数转换指针和应用程序返回段错误的警告。我知道这可以通过指针来完成,但我想知道是否有办法直接使用 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/

相关文章:

java - 需要一些管理字符串的帮助

c - 如何释放所有分配的键和值?

c++ - 超时 fwrite 调用以防止其阻塞

c - 如何使用 execvp 在 c 中编写 ls 命令

c++ - 在 C++ 中查找不适用于特定测试用例的最长子字符串

perl - 将散列中的值相加 (Perl)

c++ - 使用 CMake 构建 GStreamer 会导致 SDP 和 WebRTC 无法解析的外部符号错误

c - Json-Glib 对象插入时跳转无效

c - 为什么 strstr 在我的 C 程序中似乎不起作用?

c - 指向函数指针的指针数组的声明、分配和赋值