0

我正在尝试使用 glib 在 c++ 中实现 N-ary Tree,但由于我不是 c++ 专家,因此在找出如何正确使用它时遇到了一些问题。有没有人有一个用 C++ 编写的简单示例来帮助我理解如何使用基本功能?我在使用 g_node_traverse 时遇到了特殊问题,我就是无法正确使用 GNodeTraverseFunc。

你可以在这里找到 N-ary Tree 的描述: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 叉树的最后一段代码。

我感谢您的帮助。

4

1 回答 1

1

好吧,我已经设法运行了一些代码。问题基本上是所需的强制转换,因为 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;
    };

这个想法是将整个先前的“轨迹”存储在每个节点上,所以如果我选择一个随机节点/叶子,我不必重建轨迹,只需采用它即可。

这段代码现在有效。它可能会得到改进,我愿意接受任何评论。

我希望它对某人有用。

于 2013-03-11T10:22:04.217 回答