c++ - 如何填充 'Tree' 结构 'Declaratively'

标签 c++ visual-studio-2008 data-structures tree

我想定义一个“节点”类/结构,然后在代码中声明这些节点的树,使代码格式化的方式反射(reflect)树结构,并且没有“太多”样板的方式。

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

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

示例树节点类型:

struct node
{ 
  string name;
  node* children;

  node(const char* name, node* children);
  node(const char* name);
};

我想做什么:

声明一棵树,使其结构反射(reflect)在源代码中

node root =
  node("foo",
  [
    node("child1"),
    node("child2", 
    [
      node("grand_child1"),
      node("grand_child2"),
      node("grand_child3"
    ]),
    node("child3")
  ]);

注意:我不想做的事:

声明一大堆临时对象/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);

最佳答案

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

实际上,您可以通过将指针存储在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"))
              );
}

关于c++ - 如何填充 'Tree' 结构 'Declaratively',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13531761/

相关文章:

c++ - 您今天如何使用 C++11?

android - Cocos2d-x 3.13.1 : error with cocos run (Android)

visual-studio-2008 - Visual Studio 2008 标准版和专业版有什么区别?

java - 为什么我的 InOrder 排序的 ArrayList 不能递归地构建 LinkedBinaryTree?

c++ - 具有常量变量的类的多个实例对常量使用相同的内存?

c++ - 如何初始化作为结构指针的类成员

c++ - 构建输出与项目构建顺序不匹配

visual-studio-2008 - 是否可以在Visual Studio 2008中更改语言?

c++ - 如何初始化 std::unique_ptr<std::unique_ptr<T>[]>?

c++ - C++ unordered_map 的 rehash() 和 reserve() 方法有什么区别?