C++ 从集合中生成所有可能的有序子集

C++ 从集合中生成所有可能的有序子集,c++,algorithm,C++,Algorithm,我知道如何从包含位旋转的集合中生成所有可能的子集。比如说, //Get if nth position's bit is set bool IsBitSet(int num, int bit) { return 1 == ((num >> bit) & 1); } int subsetMaxIterCount = pow(2, someList.size()); for (int i = 0; i < subsetMaxIterCount; i++) {

我知道如何从包含位旋转的集合中生成所有可能的子集。比如说,

//Get if nth position's bit is set
bool IsBitSet(int num, int bit)
{
    return 1 == ((num >> bit) & 1);
}

int subsetMaxIterCount = pow(2, someList.size());
for (int i = 0; i < subsetMaxIterCount; i++) {
    vector<A> subset;
        for (size_t i = 0; i < jobList.size(); i++)
        {
            if (IsBitSet(jobSubsetIdx, i)) {
                //Add to subset here
            }
        }

        //Here we have a subset for some i
    }
//如果设置了第n个位置的位,则获取
布尔IsBitSet(整数,整数位)
{
返回1==((num>>位)&1);
}
int subsetMaxiteCount=pow(2,someList.size());
对于(int i=0;i
但是,这并没有考虑订购

例如,如果我有一组{1,2,3},上述算法将生成以下的子集:

{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}

实际上我需要的是这个

{}、{1}、{2}、{3}、{1,2}、{1,3}、{2,2,3}、{2,1}、{2,1,3}、{2,3,1}、{3,1}、{3,1}、{3,2}、{3,1,2}、{3,1,2}、{3,2,1}


不确定上述列表是否详尽无遗。生成这样的东西的有效算法是什么?(顺便问一下,这是所有可能的具有置换的子集吗?

我们使用位旋转生成子集的方式,每个子集都在其中排序
,例如,{1,2,3},{2,3},{1,3}
。您可以使用
next\u permutation

vector<vector<int>> mySubsetGenerator(vector<vector<int>>& subsets) {
    vector<vector<int>> extendedSubset;
    for(int i = 0; i < subsets.size(); ++i) {
         do {
             extendedSubset.push_back(subsets[i]);
         } while(next_permutation(subsets[i].begin(), subsets[i].end()));
    }
    return extendedSubset;
}
vector mySubsetGenerator(向量和子集){
向量扩展子集;
对于(int i=0;i

此外,通过获取数组的一个或多个元素,您只能使用回溯来生成所有可能的排列。

是。生成子集,然后为每个子集生成置换。std::next_置换和std::prev_置换投票关闭,因为缺少可复制的示例我有一个关于操纵杆方向问题的答案。