【问题标题】:working at each iteration g_hash_table_foreach在每次迭代中工作 g_hash_table_foreach
【发布时间】:2013-03-06 22:13:45
【问题描述】:

我希望遍历我的哈希表中的每个键值对。因此我使用了 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 不同)请问我该怎么做?

【问题讨论】:

    标签: c glib


    【解决方案1】:

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

    【讨论】:

    • 好的,谢谢,现在可以使用 =) API 还是新手。再次感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多