This question already has answers here:

Generate all combinations from multiple lists
(10个答案)
我有一个变量std::vectors<int>,假设在这个例子中我有3个向量:
std::vector<int> vect1 {1,2,3,4,5};
std::vector<int> vect2 {1,2,3,4,5};
std::vector<int> vect3 {1,2,3,4,5};

向量的值在这里并不重要。而且,这些向量的长度是可变的。
从这些向量中,我要创建向量值的每个置换,因此:
{1, 1, 1}
{1, 1, 2}
{1, 1, 3}
...
...
...
{3, 5, 5}
{4, 5, 5}
{5, 5, 5}

然后,我将把每个组合插入一个键值对映射,以便在我的应用程序中进一步使用。
实现这一目标的有效方法是什么我通常只使用for循环,遍历所有参数来创建所有组合,但是向量的数量是可变的。
谢谢您。
编辑:我将包括更多的细节。
所以,首先,我并不是真的要处理ints,而是一个自定义对象。ints只是为了简单起见。向量本身存在于像std::map<std::string, std::vector<int> >的映射中。
我的最终目标是有一个std::vector< std::map< std::string, int > >,它本质上是一个名称-值对的每个可能组合的集合。

最佳答案

“我需要生成x的所有置换”形式的许多(也许是大多数)问题可以通过创造性地使用简单的计数来解决(这也不例外)。
让我们从一个简单的例子开始:每个5个元素的3个向量对于我们的答案,我们将把这些向量的索引看作一个3位数、基-5的数字。这个数字的每个数字都是一个向量的索引。
所以,要生成所有的组合,我们只需从0到53(125)进行计数。我们将每个数字转换成3个基-5位数字,并用这些数字作为向量的索引,得到一个置换当我们达到125时,我们已经列举了这些向量的所有排列。
假设向量的长度总是相等的,那么改变向量的长度和/或数量只是改变我们使用的位数和/或基数的问题。
如果向量的长度不相等,我们只会产生一个结果,其中不是所有的数字都在同一个基中。例如,给定长度为7、4和10的三个向量,我们仍然会从0数到7x4x10=280。我们将生成最小有效数字n%10。我们将生成下一个最不重要的值(N/10)%4。
想必这足以让我们清楚地知道如何将这个概念扩展到任意数量的向量,每个向量的大小都是任意的。

关于c++ - 如何根据可变数量的STL vector 创建变量的所有排列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21738278/

10-12 01:35