如何获得vector c ++的所有可能组合

时间:2016-05-07 14:47:32

标签: c++ permutation

我有一个问题,我一直在努力解决它,但我没有找到方法。

我有vector<vector<string>> mat我不知道它的大小,我唯一知道的是每个向量上有相同数量的字符串。现在,我想要做的是获得这些字符串的所有可能组合,如: 想象一下,mat.size() = 3和mat[0].size() = 3(请记住,所有向量都有相同数量的字符串,所以如果make mat[0].size()mat[3].size()无关紧要的话)就像是获得这个位置上的所有字符串

0,0 0,1 0,2  
0,0 0,1 1,2
0,0 0,1 2,2
0,0 1,1 0,2 
0,0 1,1 1,2
0,0 1,1 2,2
0,0 2,1 0,2
0,0 2,1 1,2
0,0 2,1 2,2
1,0 0,1 0,2

依旧......

每一行都将存储在一个新的数组/向量

有什么想法吗?

编辑(如果不是很清楚):

想象一下mat有下一个数据:

mat[0] ={aa,bb,cc}
mat[1] ={dd,ee,ff}
mat[2] ={gg,hh,ll}

我想以某种方式得到的是:

aa,bb,cc
aa,bb,ff
aa,bb,ll
aa,ee,cc
aa,ee,ff
aa,ee,ll
aa,hh,cc
aa,hh,ff
aa,hh,ll

等等......

3 个答案:

答案 0 :(得分:0)

您基本上需要为矩阵的每一列嵌套for循环。但由于列数是动态的,因此您无法真正做到这一点。你可以做的是使用递归函数,在其中迭代遍历行的for循环,并根据参数选择列,该参数在每次递归调用时递增。像这样:

void permute_impl(size_t width, std::vector<std::vector<int>> const &mat,
                  size_t column, std::vector<int> &prefix) {
  if (column < width) {
    for (auto &row : mat) {
      prefix.push_back(row[column]);
      permute_impl(width, mat, column + 1, prefix);
      prefix.pop_back();
    }
  } else {
    for (auto i : prefix)
      std::cout << i << ' ';
    std::cout << '\n';
  }
}

void permute(std::vector<std::vector<int>> const &mat) {
  if (mat.empty())
    return;
  std::vector<int> prefix;
  size_t N = mat[0].size();
  // assert that all rows are the same size
  for (auto &row : mat)
    assert(row.size() == N);
  permute_impl(N, mat, 0, prefix);
}

DEMO

答案 1 :(得分:0)

vector<vector<string>> mat; // each interior vector has the same length
// populate mat somehow...

size_t width = mat.at(0).size();
vector<string> out(pow(mat.size(), width);

// each value of first column is repeated (rows^(cols-1)) times
size_t reps = out.size(); 
for (size_t col = 0; col < width; ++col) {
    reps /= width;
    for (size_t ii = 0; ii < out.size(); ++ii) {
        if (ii != 0) {
            out[ii].append(',');
        } else {
            out[ii].reserve(2 * width); // performance optimization
        }
        size_t row = ii / reps % mat.size();
        out[ii].append(mat[row][col]); // write one cell of output
    }
}

如果我们事先知道字符串有一些固定的长度,我们可以优化reserve()调用,但我只假设每个字符串至少有一个字符。

答案 2 :(得分:0)

我没有时间解决这个问题,但我尝试了10分钟,我想我可以回答你的问题。我想你想找到所有可能的组合。所以我在这么短的时间内解决了这个问题:

ServiceControl.Stop()
Do
    ServiceControl.Refresh()
    If ServiceControl.Status = ServiceControllerStatus.Stopped Then
        ServiceControl.Start()
        Exit Do
    End If
Loop

如您所见,我使用队列解决了这个问题,并将组合存储在矢量中。