这是我一直坚持的一小部分,它是更大任务的一部分。
我有一个2D矢量,例如:
v1: 0 1 2 3 4
v2: 0 1 2
v3: 0 1 2 3 4
v4: 0 1 2 3
v5: 0 1 2 3 4
(每行是一个向量)
我需要找到所有排列,从每行中选择一个元素。有人指出,这将是笛卡儿的产品
我尝试使用循环,但这只能在一个方向上工作(它错过了很多排列)
我也调查了next_permutation,但我不确定是否可以将它应用于2D矢量。
此外,行数不是静态的,因此我无法嵌套5个循环,因为根据条件可能会有更多或更少的行。
有办法做到这一点吗?
答案 0 :(得分:2)
我将写出一个可能的答案,这个答案效率不高,但应该可以使用。
请注意,我假设(在您的示例中)您需要所有5个元素组,第一个元素取自v1,第二个元素取自v2,第三个取自v3等。
void gen_all (
vector<vector<int> > & output_perms,
vector<vector<int> > const & input,
vector<int> & cur_perm,
unsigned cur_row = 0
)
{
if (cur_row >= input.size())
{
// This is where you have found a new permutation.
// Do whatever you want with it.
output_perms.push_back (cur_perm);
return;
}
for (unsigned i = 0; i < input[cur_row].size(); ++i)
{
cur_perm.push_back (input[cur_row][i]);
gen_all (output_perms, input, cur_perm, cur_row + 1);
cur_perm.pop_back ();
}
}
像这样调用上述函数:(假设v
保存原始集。)
vector<vector<int> > output;
vector<int> temp;
gen_all (output, v, temp);
正如我之前所说,有更多有效和优雅的方法,上面的代码甚至可能无法编译(我只是在这里写。)
答案 1 :(得分:1)
std::next_permutation
仅适用于一组迭代器。它不保留任何静态内存,它都基于迭代器的当前状态。这意味着您可以一次在多个矢量上使用它。不要试图立即置换整个结构。