如何"声明性地"填充"树"结构

mac*_*nir 6 c++ tree visual-studio-2008 data-structures

我想定义一个'node'类/结构,然后在代码中声明这些节点的树,这样代码的格式反映了树的结构,并且没有"太多"的样板.

请注意,这不是关于数据结构的问题,而是关于我可以使用C++的哪些功能来获得与下面示例类似的声明性代码样式.

可能使用C++ 0X,这将更容易,因为它在构建对象和集合方面具有更多功能,但我使用的是Visual Studio 2008.

示例树节点类型:

struct node
{ 
  string name;
  node* children;

  node(const char* name, node* children);
  node(const char* name);
};
Run Code Online (Sandbox Code Playgroud)

我想做的事:

声明一棵树,使其结构反映在源代码中

node root =
  node("foo",
  [
    node("child1"),
    node("child2", 
    [
      node("grand_child1"),
      node("grand_child2"),
      node("grand_child3"
    ]),
    node("child3")
  ]);
Run Code Online (Sandbox Code Playgroud)

NB:我不想做的事情:

声明一大堆临时对象/ colls并构造树'向后'

node grandkids[] = node[3] 
{
  node("grand_child1"),
  node("grand_child2"),
  node("grand_child3"
};

node kids[] = node[3]
{
  node("child1"),
  node("child2", grandkids) 
  node("child3")
};

node root = node("foo", kids);
Run Code Online (Sandbox Code Playgroud)

小智 2

如果您不介意过度复制节点并使用括号()而不是方括号,[]那么这应该可行。

实际上,您可以通过将指针存储在node_group而不是副本中来避免复制,但由于这是星期五下午,而且我很懒,所以我将其留给您。

struct node
{
    std::string name;
    std::vector<node> children;

    node(const char* n)
        :   name (n)
    {
    }

    node(const char* n, const class node_group& group);
};

struct node_group
{
    std::vector<node> children;
};

node::node(const char* n, const class node_group& group)
    :   name (n)
    ,   children (group.children)
{
}

node_group operator ,(const node& n1, const node& n2)
{
    node_group group;
    group.children.push_back (n1);
    group.children.push_back (n2);
    return group;
}

node_group operator ,(const node_group& gr, const node& n2)
{
    node_group group (gr);
    group.children.push_back (n2);
    return group;
}


int main ()
{
    node root ("foo",
                (node("child1"),
                node("child2",
                    (node("grand_child1"),
                    node("grand_child2"),
                    node("grand_child3"))
                    ),
                node("child3"))
              );
}
Run Code Online (Sandbox Code Playgroud)