g_tree_insert会覆盖所有数据

时间:2010-03-23 05:50:09

标签: binary-tree overwrite binary-search-tree

我想知道如何使用GTree(来自GLib)来存储数据?我使用g_tree_insert例程插入到GTree中的每个新值都会覆盖前一个值!

GTree *tree; //init
tree = g_tree_new( g_str_equal ); //"g_str_equal" is a GLib default compare func
//...
for( i = 0; i < 100; ++i )
    g_tree_insert( tree, random_key(), random_value() ); //insert some random vals
//
printf( "%d", g_tree_nnodes( tree ) ); //should be 100? NO! Prints "1"!!!

我做错了什么?谢谢。

2 个答案:

答案 0 :(得分:1)

那是因为平等与比较不同,g_tree_new需要一个函数,它给你两个键的 order (即字典顺序),而不仅仅是它们是否相等。

答案 1 :(得分:0)

我想我找到了解决方案。问题在于:

tree = g_tree_new( g_str_equal );

官方教程说它是默认的GCompareFunc之一,所以我决定使用它(顺便说一句,我成功地在GHashTable中使用它没有问题)。但这是麻烦。正确的初始化是:

tree = g_tree_new((GCompareFunc)g_ascii_strcasecmp);

瞧!有用! Thanx到IBM教程。