任意数量的嵌套循环?

Nic*_*k L 11 c++ nested metaprogramming permutation

我希望采用任意数量的列表(例如[2,1,4 ...],[8,3,...],...)并从每个列表中选择数字以生成所有排列.例如:

[2,8,...],[2,3,...],[1,8,...],[1,3,...],[4,8,...], [4,3,...],......

这可以使用嵌套的for循环轻松完成,但由于我希望它接受任意数量的列表,似乎for循环必须是硬编码的.每个列表一个.此外,由于我的程序可能会产生数万个排列,我想一次生成一个单独的排列(而不是一次性计算它们并将结果存储到向量中).有没有办法以编程方式完成此操作?

由于在编译时知道列表的数量,我想也许我可以使用基于模板的元编程.然而,这看起来很笨拙,也不符合"一次一个"的要求.有什么建议?

Pal*_*sal 6

您可以使用计数的基本原理,例如递增最后一位数直到达到其最大值,然后递增倒数第二位,依此类推,就像倒计时一样这里是一个示例代码,假设可能存在差异列表的差异.

#include <iostream>
using namespace std;
int main() {
    int n;
    cin>>n;
    int a[n], len[n],i,j;
    for(i = 0 ; i < n ; i++)
    {
        cin>>len[i];
        a[i]=0;
    }
    while(1)
    {
        for(i = 0 ; i< n;i++)
            cout<<a[i]<<" ";
        cout<<endl;
        for(j = n-1 ; j>=0 ; j--)
        {
            if(++a[j]<=len[j])
                break;
            else
                a[j]=0;
        }
        if(j<0)
            break;
    }    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

尝试运行代码,4 1 1 1 1它将给出0和1的所有4位数排列.

0 0 0 0 
0 0 0 1 
0 0 1 0 
0 0 1 1 
0 1 0 0 
0 1 0 1 
0 1 1 0 
0 1 1 1 
1 0 0 0 
1 0 0 1 
1 0 1 0 
1 0 1 1 
1 1 0 0 
1 1 0 1 
1 1 1 0 
1 1 1 1 
Run Code Online (Sandbox Code Playgroud)

您可以使用2d数组来获取nos的组合.


rwo*_*ong 2

STL 没有为此提供现成的函数,但是您可以通过修改next_permutation.

该问题类似于实现二进制数字加法器。增量array[0]。如果新的值array[0]溢出(意味着它的值大于您拥有的列表的数量),则设置array[0]为零并递增array[1]。等等。