在每次迭代工作g_hash_table_foreach

时间:2013-03-06 10:32:03

标签: c glib

我希望遍历哈希表中的每个键值对。因此我使用了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变量声明为out,并在每对迭代中增加其值。但是,我不认为glib允许我一次控制一个键值对。 (与具有下一个属性的GList不同)任何想法我怎么能这样做呢?

1 个答案:

答案 0 :(得分:6)

这就是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(迫使程序员使用全局状态)时,我都会感到畏缩。抱怨并且,如果可能的话,修复它。

UPDATE :另外,为了完整起见,您实际上可以使用GHashTable的“迭代”API在没有回调的情况下执行此操作。

查看g_hash_table_iter_init()g_hash_table_iter_next()功能。这些至少需要glib版本2.16。