我正在尝试使用glib在c ++中实现N元树,但是由于我不是c ++专家,因此在寻找正确使用它的过程中遇到了一些问题。有没有人用C ++编写过一个简单的示例来帮助我理解如何使用基本功能?我在g_node_traverse方面遇到特殊问题,只是无法正确使用GNodeTraverseFunc。
您可以在此处找到N元树的描述:
http://developer.gnome.org/glib/stable/glib-N-ary-Trees.html
我在c中找到了一些示例,但在这里我无法设法将其正确转换为c ++:
http://www.ibm.com/developerworks/linux/tutorials/l-glib/section7.html
尝试了n元树的最后一段代码。
我感谢您的帮助。
最佳答案
好吧,我设法运行了一些代码。问题基本上是所需的强制类型转换,因为Gnome使用gpointers,而我的数据要存储在结构中。所以我的代码是:
gboolean iter(GNode* n, gpointer data) {
node s=*(node *)(n->data);
int ID=g_node_depth(n);
if (G_NODE_IS_ROOT(n)==true)
{
std::cout<<"Node "<<ID<<" is a Root"<<std::endl;
}
else if (G_NODE_IS_LEAF(n)==true)
{
std::cout<<"Node "<<ID<<" is a Leaf"<<std::endl;
}
std::cout<<"Speed of Node "<<ID<<" is: "<<s.v<<std::endl;
return FALSE;
}
int main(){
node prueba,prueba1;
prueba.phi=0;
prueba.v=1;
prueba.x=50;
prueba.y=100; //Position in y
prueba1.phi=90;
prueba1.v=6;
prueba1.x=30;
prueba1.y=90;
GNode * root = g_node_new((gpointer) &prueba);
g_node_append(root, g_node_new((gpointer) &prueba1));
g_node_traverse(root, G_PRE_ORDER, G_TRAVERSE_ALL, -1, iter, NULL);
return 0;
}
我的结构在哪里:
struct state {
double x; //Position in x of a car
double y; //Position in y "
double phi; //Yaw angle of a car
double v; //Speed of a car
};
struct node {
double x;
double y;
double phi;
double v;
std::vector <state > trajectory;
};
想法是将整个先前的“轨迹”存储在每个节点上,因此,如果我选择一个随机节点/叶子,则不必重建轨迹,而只需采用它即可。
该代码现在可以使用。可能会有所改善,我欢迎任何评论。
我希望它对某人有用。
关于c++ - C++中Gnome N元树的用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15280614/