如何根据范围创建名称

时间:2019-07-17 07:03:01

标签: c++

我需要根据相同范围创建名称。我下面的xml数组代表了一些范围

<array>
 <range index="j" min="0" max="2" />
 <range index="k" min="1" max="6" />
 <range index = "l" min = "0" max = "1"/>
</array>

这些可以扩展到m,n,o等。

所以我想要的是能够以如下所示的方式获取名称:

  

BASENAME_0_1_0(表示j = 0,k = 1,l = 0)

     

BASENAME_0_1_0

     

BASENAME_0_2_0

     

BASENAME_0_2_0

根据最大值和最小值,最后一个元素应该是

  

BASENAME_2_6_1(意味着j = 2,k = 6,l = 1)

我如何编写c ++代码以独立于范围限制来获得这样的“基本名称”?

1 个答案:

答案 0 :(得分:2)

generate函数具有两个参数:要探索的范围列表以及树的当前路径中的组合。如果范围列表为空,则打印组合。如果列表不为空,则探索第一个范围(通过该范围内的for循环),并为每种可能性调用递归函数。

#include <vector>
#include <iostream>
struct range {
    int lo, hi;
};

using ranges = std::vector<range>;
using state = std::vector<int>;

void generate(ranges rs, state s={}) {
    if (rs.empty()) {
        for (auto i : s) {
            std::cout << i << " ";
        }
        std::cout << std::endl;
    } else {
        range first = rs[0];
        rs.erase(begin(rs));
        s.push_back(0);
        for (int i = first.lo; i <= first.hi; i++) {
            s.back() = i;
            generate(rs, s);
        }
    }
}

int main() {
    range j {0, 2};
    range k {1, 6};
    range l {0, 1};
    generate({j,k,l});
}