- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 glib
g_hash_table
创建一个哈希表,其中 int64 作为键,指针作为值。
我试过这段代码但失败了:
GHashTable* hash = g_hash_table_new(g_int64_hash, g_int64_equal);
uint64_t mer_v = 0;
exist_m = g_hash_table_lookup(hash, mer_v);
报错:
(gdb) bt
#0 IA__g_int64_hash (v=0x1d89e81700000) at /build/buildd/glib2.0-2.24.1/glib/gutils.c:3294
#1 0x00007ff2de966ded in g_hash_table_lookup_node (hash_table=0x13a4050, key=0x1d89e81700000) at /build/buildd/glib2.0-2.24.1/glib/ghash.c:309
#2 IA__g_hash_table_lookup (hash_table=0x13a4050, key=0x1d89e81700000) at /build/buildd/glib2.0-2.24.1/glib/ghash.c:898
我经常使用 glib
数据结构,但从未尝试过使用 int64 键的 hash_table。无法从 Google 找到任何帮助。本教程也没有任何命中:http://www.ibm.com/developerworks/linux/tutorials/l-glib/section5.html .
请帮忙。谢谢。
最佳答案
要使用 g_int64_hash
和 g_int64_equal
,您需要在哈希表中存储 64 位 key 的地址。因此,正确的查找是:
exist_m = g_hash_table_lookup(hash, &mer_v);
要使用此哈希器/比较器,需要动态分配所有键,并将它们的地址传递给 g_hash_table_insert
和 g_hash_table_lookup
:
uint64_t *mer_p = malloc(sizeof(uint64_t));
*mer_p = mer_v;
g_hash_table_insert(hash, (gpointer) mer_p, (gpointer) m);
exists = g_hash_table_lookup(hash, (gpointer) &mer_v);
一个常见的优化是将整数值直接存储为哈希表键,而不是它们的地址。哈希器和比较器然后是 g_direct_hash
和 g_direct_equal
.这要求所有整数键都适合指针的大小(如果可以使用 uintptr_t
则保证),并且可以将任意整数强制转换为指针并返回(ISO C 不保证,但尊重主要平台)。在那种情况下,插入和查找看起来像这样:
g_hash_table_insert(hash, (gpointer) mer_v, (gpointer) m);
exists = g_hash_table_lookup(hash, (gpointer) mer_v);
关于c - gp_hash_table : int64 as key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15631157/
我正在使用 glib g_hash_table 创建一个哈希表,其中 int64 作为键,指针作为值。 我试过这段代码但失败了: GHashTable* hash = g_hash_table_new
我是一名优秀的程序员,十分优秀!