测试所有组合 (c++)

test all combination (c++)

我认为这是一个经典问题,但我没有找到适合我问题的答案。 我有两个 'MyObject' 向量,我想遍历第一个向量元素与第二个向量元素的所有可能组合,并分别处理所有情况。 (第二个向量可能比第一个向量有更多的元素)。 这是我目前正在做的事情的伪代码

select_assignement(vector1, vector2, assignement){
    vector1_memory = copy(vector1);
    vector2_memomry = copy(vector2);

    foreach(element1 in vector1){
        foreach(element2 in vector2){
            assignement[element1] = element2;
            vector1_memory.remove(element1);
            vector2_memory.remove(element2);
            if(vector1_memory.size()>0)
                select_assignement(vector1_memory, vector2_memory, assignement);
            else
                print_assignment(assignment); // Here I finally get one possible assignement
        }
    }
}

这里我假设vector1小于或等于vector2。所以我在两个向量之间分配每对 'MyObject' ,如果还有一些元素,我会递归地再做一次。我的问题是我必须在每次递归时复制向量,因为我无法在向量循环中删除对象... 我的问题是:这样做是正确的方法,还是我完全疯了?

感谢您的帮助

编辑: 两个列表 [a,b,c][1,2,3,4] 的输出将是:

assignement : [a1,b2,c3]
assignement : [a1,b2,c4]
 ... 
assignement : [a4,b3,c2]

实际上我认为使用 next_permutation 更好,如您所说:

void Part::select_assignement(std::vector<MyObject> & vector1, std::vector<MyObject> & vector2 ){
    std::map<MyObject,MyObject> assignement;
    do {
        j++;
        assignement.clear();
        for (size_t i = 0; i < vector1.size(); ++i)
            assignement[vector1[i]] = vector2[i];
        treat_this_case(assignement);
    }while(std::next_permutation(vector2.begin(), vector2.end()));
}

在我看来,它做的事情与以前完全相同,但方式更简单。