首页 > 解决方案 > 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 解决方案将是理想的,但我也对更现代的方式感兴趣。

标签: c++treestlcompile-time

解决方案


推荐阅读