gpt4 book ai didi

c++ - 创建多个 vector 的所有可能组合

转载 作者:行者123 更新时间:2023-11-30 05:05:35 27 4
gpt4 key购买 nike

我想创建几个 vector 的组合

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

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

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

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

最佳答案

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

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

每个子 vector 有 10 个项目,或者每个子 vector 中有相同数量的项目,这没什么神奇的。碰巧每个有 10 个项目,每个数组的索引对应于我们习惯在 10 进制数中看到/使用的数字。

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

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

size_t max = 1;

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

然后我们简单地从 0 计数到 max,除以各自的 vector 大小后取余数,并使用它们索引子 vector :

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。如果这是 Not Acceptable ,有许多简单的方法可以纠正这种情况。最简单的可能是从简单地反转输入 vector 开始:

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

如果您希望生成永远完成的组合,则输入 vector 将足够小,以便此 O(N) 操作对任何事情都几乎没有影响。

关于c++ - 创建多个 vector 的所有可能组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48270565/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com