可能重复:
How can I create cartesian product of vector of vectors?
我遇到了一些逻辑问题,想出如何在二维矢量中生成所有元素组合。在这里,我创建了一个2D矢量。这两个维度的大小都不能假设。
#include <iostream>
#include <vector>
using namespace std;
int main() {
srand(time(NULL));
vector< vector<int> > array;
// This creates the following:
// array[0]: {0, 1, 2}
// array[1]: {3, 4, 5, 9}
// array[2]: {6, 7, 8}
for(int i=0; i<3; i++) {
vector<int> tmp;
tmp.push_back((i*3)+0); tmp.push_back((i*3)+1); tmp.push_back((i*3)+2);
if(i==1)
tmp.push_back((i*3)+6);
array.push_back(tmp);
}
}
创建矢量后,我想输出所有可能的组合,如下所示:
comb[0] = {0, 3, 6}
comb[1] = {0, 3, 7}
comb[2] = {0, 3, 8}
comb[3] = {0, 4, 6}
comb[4] = {0, 4, 7}
comb[x] = {...}
但是,我很难理解如何正确地构建循环结构,其中大小'array'和每个子数组中的元素是未知/动态的。
编辑1:不能假设有3个阵列。它们有array.size();)
答案 0 :(得分:6)
未知大小的最简单方法是递归。
void combinations(vector<vector<int> > array, int i, vector<int> accum)
{
if (i == array.size()) // done, no more rows
{
comb.push_back(accum); // assuming comb is global
}
else
{
vector<int> row = array[i];
for(int j = 0; j < row.size(); ++j)
{
vector<int> tmp(accum);
tmp.push_back(row[j]);
combinations(array,i+1,tmp);
}
}
}
最初使用i = 0
和空accum
进行通话。
答案 1 :(得分:2)
你有三个阵列,对吗?每一个的大小都不同,你想要所有的组合。如果是这样,这应该可以帮到你:
的伪代码:
for(i=0; i<size(array0), i++) {
for(j=0; j<size(array1), j++) {
for(k=0; k<size(array2), k++) {
print("{array0[i], array1[j], array2[k]} \n");
}
}
}
我希望你能把它重写为C ++代码
编辑:这适用于任意数量的数组
第一个for
只是打印而第二个for
移动数组的索引(关心溢出)
再次伪码:
comb = 0;
stop = false;
while(!stop) {
output("Combination["+comb+"] = {");
for(i = 0; i < num_of_arrays; i++) {
index = index_array[i];
output(array[i][index]); // assume this function takes care about right formatting
}
output("}\n");
index_array[num_of_arrays-1]++;
for(i = num_of_arrays-1; i >= 0; i--) {
index = index_array[i]
if(index == size(array[i]) {
if(i == 0)
stop = true;
else {
index_array[i] = 0;
index_array[i-1]++;
}
}
}
comb++;
}
希望这有帮助!