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)
| 归档时间: |
|
| 查看次数: |
864 次 |
| 最近记录: |