c++ - C++11 STL 在编译时从子树中生成树的方法?
问题描述
我有一棵由向量组成的树。
template<class T>
struct Node {
T value;
std::vector<Node<T>> children;
};
static const std::vector<Node<int>> tree
{
{ 1, {
{ 2, {
{ 3, {} },
{ 4, {} }
} },
{ 5, {
{ 6, {} },
{ 7, {} }
} }
} },
{ 8, {
{ 9, {} }
} },
{ 10, {
{ 11, {} }
} }
};
我对这个树结构很满意。它是纯 STL,因此安全且易于理解。但是规格发生了变化,现在我必须公开两棵树——这棵树,还有一棵略有变化的树。
static const std::vector<Node<int>> tree2
{
{ 1, {} },
{ 2, {
{ 3, {} },
{ 4, {} }
} },
{ 5, {
{ 6, {} },
{ 7, {} }
} },
{ 8, {
{ 9, {} }
} },
{ 10, {
{ 11, {} }
} }
};
2 到 7 子树上升了一个等级,但除此之外,它是同一棵树,如果第一个子树的规格发生变化,那么第二个子树的规格也会发生变化,唯一永久的区别是 2 到 7子树向上移动一个等级。
这意味着我不应该分别定义这两个树 - 我应该定义子树(在本例中,2 到 7 和 8 到 11),并在定义这两个树时使用这些子树。
在非语法正确的 C++ 中,它看起来像:
static const std::vector<Node<int>> subtree2to7
{
{ 2, {
{ 3, {} },
{ 4, {} }
} },
{ 5, {
{ 6, {} },
{ 7, {} }
} }
};
static const std::vector<Node<int>> subtree8to11
{
{ 8, {
{ 9, {} }
} },
{ 10, {
{ 11, {} }
} }
};
static const std::vector<Node<int>> tree
{
{ 1, subtree2to7 }
+ subtree8to11
};
static const std::vector<Node<int>> tree2
{
{ 1, {} }
+ subtree2to7
+ subtree8to11
};
这很容易动态地使用insert
. 但我很好奇 - 编译时呢?我怎样才能以最少的自定义代码和可读性损失来实现这种树结构呢?
作为记录,我并没有特别std::vector
关注 - 任何可迭代的容器都可以。C++11 解决方案将是理想的,但我也对更现代的方式感兴趣。
解决方案
推荐阅读
- php - 如何在 DOM 中的文本节点前插入文本?
- flutter - 在 Flutter 中堆叠条件导航器按钮
- java - 将双倍转换为分钟和秒以计算步行/跑步速度
- xamarin - 无论如何禁用 TableView Xamarin Forms 中的 viewCell 突出显示?
- android - BroadcastReceiver 抛出内存不足错误。可能是什么原因和任何解决方案?
- node.js - 使用 Node.js 从 JSON 中提取数据
- data-binding - 淘汰绑定问题:定义了匿名模板,但未提供模板内容
- wordpress - 使用 Ionic 或 Flutter 和 Strapi 或 wordpress 作为后端构建应用程序时,Azure AD SSO 身份验证发生在哪里?
- php - 第一次使用 symfony 框架,我遇到了这个问题语法错误,意外的 '{'
- javascript - 如何使用本地数据创建具有无限滚动的平面列表?(可能使用状态误用)