创建多个向量的所有可能组合

时间:2018-01-15 20:58:46

标签: c++ vector int combinations

我想创建几个向量的组合

vector<int> Vec1;
Vec1.push_back(1);
Vec1.push_back(2);
Vec1.push_back(3);

vector <int> Vec2;
Vec2.push_back(5);
Vec2.push_back(6);
Vec2.push_back(7);
Vec2.push_back(8);

vector <int> Vec3;
Vec3.push_back(11);
Vec3.push_back(12);
Vec3.push_back(13);

vector<vector<int>> xt;
xt.push_back(Vec1);
xt.push_back(Vec2);
xt.push_back(Vec3);

结果应该类似

1 5 11
1 5 12
...
3 8 13

我可以对给定数量的向量使用嵌套循环。但是,我正在尝试编写一个函数,比如 void printAll(const vector&gt;&amp; xt) 我找到了类似的东西

Howto create combinations of several vectors without hardcoding loops in C++?

但我正在努力将其转换为int。请给我一些建议。

2 个答案:

答案 0 :(得分:1)

而不是递归函数(有效,但在实践中可能很笨拙),我宁愿将此视为一个简单的计数问题。

让我们从一个简化的假设开始:我们每个都有3个10个元素的数组。在这种情况下,很明显我们可以简单地从0(我们认为是000)到999计算所有组合,并将每个数字作为下标用于相应的子矢量

每个子矢量有10个项目,或每个子矢量中具有相同数量的项目,没有什么魔力。只是每个10个项目,每个数组的索引对应于我们习惯于在10号基数中看到/使用的数字。

当我们处理基数为10的数字时,我们可以使用除以10之后的余数来得到我们需要的每个数字。对于手头的任务,我们可以大致相同,只是我们使用除以子数组中元素数量的除法。

因此,让我们从计算输入中的组合数开始(目前,我们假设每个子向量的大小都是非零):

size_t max = 1;

for (auto const &v : allVecs)
    max *= v.size();

然后我们只需从0计算到max,在除以相应的矢量大小后取余数,然后使用它们索引到子矢量:

for (size_t i=0; i<max; i++) {
    auto temp = i;
    for (auto const &vec : allVecs) {
        auto index = temp % vec.size();
        temp /= vec.size();
        std::cout << vec[index] << ' ';
    }
    std::cout << '\n';
}

现在看来,这有一点可能发现令人困惑或有问题:它会按照您预期的顺序打印出结果。例如,代替您显示为第一个输出的1 5 11,它将显示11 5 1。如果这是不可接受的,有很多简单的方法可以纠正这种情况。最简单的方法可能是简单地反转输入向量:

std::reverse(allVecs.begin(), allVecs.end());

如果您有希望生成组合以完成任务,那么输入向量将足够小以使此O(N)操作对任何事物几乎没有影响。

答案 1 :(得分:0)

您可以使用void printAll(const std::vector<std::vector<int> > &allVecs, size_t vecIndex, std::string strSoFar) { if (vecIndex >= allVecs.size()) { std::cout << strSoFar << std::endl; return; } for (size_t i=0; i<allVecs[vecIndex].size(); i++) printAll(allVecs, vecIndex+1, strSoFar+std::to_string(allVecs[vecIndex][i])); } 将建议的算法转换为int。

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) on project mycomponent: Failed to deploy artifacts: Could not transfer artifact nz.co.mycompmany:mycomponent:zip:1.0.35-20180115.210413-4 from/to libs-snapshot-local (https://mycompmany/libs-snapshot-local/): Access denied to: https://mycompmany/libs-snapshot-local/nz/co/mycompmany/mycomponent/1.0.35-SNAPSHOT/mycomponent-1.0.35-20180115.210413-4.zip, ReasonPhrase: . -> [Help 1]