glib2 哈希表 : GINT_TO_POINTER macro

标签 glib

我认为我不理解glib2的哈希表,特别是当键和值都是整数时如何正确使用GINT_TO_POINTER。我认为这是创建新哈希表时使用 g_int_hashg_int_equal 的用例。然而,下面的代码片段会出现错误。

#include <glib.h>

int main(void) {
    GHashTable * freq = g_hash_table_new(g_int_hash, g_int_equal);
    for (int i = 0; i < 10; i++) {
        g_hash_table_insert(freq, GINT_TO_POINTER(i), GINT_TO_POINTER(0));
    }
    g_hash_table_destroy(freq);
}

我知道两种方法可以解决这个问题:一种是创建一个像这样的哈希表而不更改任何其他内容:

   GHashTable * freq = g_hash_table_new(g_direct_hash, g_direct_equal);

第二种方法是,保持创建原样,但为键和值显式分配空间:

   int * key = malloc(sizeof(int));
   int * value = malloc(sizeof(int));

然后通过将其强制转换为 (gpointer) 来插入键和值。

第二种方法似乎是进行键值对的一种非常乏味的方法,这是进行int到int映射的正确方法吗?谢谢。

最佳答案

g_int_hash() 的文档说:

Note that this function acts on pointers to gint, not on gint directly: if your hash table's keys are of the form GINT_TO_POINTER (n), use g_direct_hash() instead.

所以,是的,如果您正在进行 int 到 int 的映射,您应该使用 g_direct_hash()g_direct_equal()GINT_TO_POINTER().

关于glib2 哈希表 : GINT_TO_POINTER macro,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22057521/

相关文章:

c++ - 如何使用 GTK 信号?

c++ - 无法增加 Glib::ustring::iterator(出现 "invalid lvalue in increment"编译器错误)

c - glib 或 libc 中是否有与 boost::filesystem::remove_all(path) 类似的函数?

c - g_object_unref : assertion 'G_IS_OBJECT (object)' failed

c - pango+开罗 Hello World 泄露

java - Glib内存分配错误

python - 我可以将 Python 脚本作为 Glib GModules 加载吗?

glib - GLib 和 GObject 到底是什么?

c++ - 如何查看新添加的焊盘类型?

c - 当主循环在 Gstreamer 中运行时,如何从控制台(stdin)读取并执行用户命令?