我希望遍历哈希表中的每个键值对。因此我使用了 g_hash_table_foreach() 函数(原型(prototype)如下所示)。对于每个键值对,它调用一个 void func 方法。
void g_hash_table_foreach(GHashTable *hash_table,GHFunc func,
gpointer user_data);
但是,我要求每次调用该函数时,该方法都返回一个值。
例如考虑以下代码:
void calculate(gpointer key, gpointer value, gpointer userdata)
{
return calculateNumbers(key, value);
}
int total = 0;
g_hash_table_foreach(mymap, calculate, NULL);
我要求变量 total 存储 calculate() 函数接收到的每个返回值的总和。我发现很难用 g_hash_table_foreach 方法做到这一点。
我宁愿有一个 while 循环,在外部声明 total 变量,并在每对变量的每次迭代中增加它的值。但是,我认为 glib 不允许我一次考虑一个键值对。 (与具有下一个属性的 GList 不同)请问我该怎么做?
最佳答案
这就是 API 为您提供“用户指针”的原因。在那里传递您需要的任何数据,例如 total
变量的地址:
static void calculate(gpointer key, gpointer value, gpointer userdata)
{
int *total = userdata;
*total += calculateNumbers(key, value);
}
g_hash_table_foreach(mymap, calculate, &total);
glib 和 GTK+ API:s 非常擅长提供用户指针,这让我“被宠坏了”;每当看到涉及回调的 C API(强制程序员使用全局状态)时,我都会畏缩。并提示。并且,如果可能,修复它。
更新:此外,为了完整起见,您实际上可以在没有回调的情况下使用 GHashTable 的“迭代”API 执行此操作。
参见 g_hash_table_iter_init()
和 g_hash_table_iter_next()
职能。这些至少需要 glib 版本 2.16。
关于c - 在每次迭代中工作 g_hash_table_foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15244851/