4

我希望遍历我的哈希表中的每个键值对。因此我使用了 g_hash_table_foreach() 函数(原型如下所示)。对于每个键值对,它调用一个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循环,在外面声明总变量,并在每对的每次迭代中增加它的值。但是,我认为 glib 不允许我一次考虑一个键值对。(与具有下一个属性的 GList 不同)请问我该怎么做?

4

1 回答 1

7

这就是 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 版。

于 2013-03-06T10:36:38.207 回答