我需要開發一套功能擴展glib2
GTree
有:如何有效地找到最後一個鍵和值GTree
- 找到第一個元素
- 找到最後
- 找到最近的(地板,小區,最大小於,最小大於)
找到第一個很容易。首先,您只需停止g_tree_foreach()
回調。但是如何找到最後一個元素而不需要遍歷整棵樹?
我以爲我可以使用g_tree_search()
的回調函數,它會一直返回正值直到找到,但我怎麼知道我目前在最後一個元素上?
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include <glib.h>
static
gint compare_int(gconstpointer p1, gconstpointer p2) {
int i1 = GPOINTER_TO_INT(p1);
int i2 = GPOINTER_TO_INT(p2);
//printf("%d %d\n", i1, i2);
return i1 == i2 ? 0 : i1 > i2 ? 1 : -1;
}
static
gboolean traverse(gpointer key, gpointer value, gpointer data) {
//int ikey = GPOINTER_TO_INT(key);
const char *sval = (const char *)value;
printf("%s\n", sval);
return FALSE;
}
static
gint find_last(gconstpointer p, gpointer user_data) {
return 1;
}
static inline const char *NULS(const char *s) {
return s ? s : "NULL";
}
int main(int argc, char *argv[]) {
GTree *tree = g_tree_new(compare_int);
g_tree_insert(tree, GINT_TO_POINTER(10), "ten");
g_tree_insert(tree, GINT_TO_POINTER(-99), "minus ninety-nine");
g_tree_insert(tree, GINT_TO_POINTER(8), "eight");
g_tree_foreach(tree, traverse, NULL);
printf("=======\n%s\n", NULS((const char*)g_tree_search(tree, (GCompareFunc)find_last, NULL)));
return 0;
}
'g_tree_nnodes()'應該爲您提供您可以用作find_first的方法的節點數量。雖然沒有那麼優化,但GTree的目標不是這樣。 –
更好的替代glib2? – basin
編寫您自己的滿足您需求的樹實現。 –