测试所有组合(c++)
我认为这是一个经典的问题,但我没有找到一个适合我的问题的答案。 我有两个“MyObject”的向量,我想遍历第一个向量和第二个向量元素的所有可能组合,并分别处理所有情况。第二个向量可能比第一个向量包含更多的元素。 以下是我目前正在做的工作的伪代码:测试所有组合(c++),c++,combinations,C++,Combinations,我认为这是一个经典的问题,但我没有找到一个适合我的问题的答案。 我有两个“MyObject”的向量,我想遍历第一个向量和第二个向量元素的所有可能组合,并分别处理所有情况。第二个向量可能比第一个向量包含更多的元素。 以下是我目前正在做的工作的伪代码: select_assignement(vector1, vector2, assignement){ vector1_memory = copy(vector1); vector2_memomry = copy(vector2);
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_置换更好,正如你所说:
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()));
}
在我看来,它做的事情和以前完全一样,但要简单得多。为你做一个普通的双人舞有什么不对?为什么要递归?一个双for循环会给出vector1的一个元素和vector2的一个元素之间的所有组合,但不是vector1的整个元素集和vector2的整个元素集的所有组合。或者我设计了这个poorlyDo你是说连接vec1和vec2,然后洗牌得到的vec3?或者洗牌然后连接?我很难理解你的目标。我的意思是,如果有两个列表[a,b,c]和[1,2,3,4],我不想作为输出:{[a1],[a2],…[c3],[c4]}但是{[a1,b2,c3],[a1,b2,c4],[a4,b3,c2]}你能用两个简单的向量为你的问题添加一个简单的例子吗?例如三和二元素?这里唯一的一点是,如果vector2.size>vector1.size,当我得到赋值范围之外的置换时,我会得到几次相同的组合。。。但在我的场景中,这不是一个问题。我的测试表明,它似乎比第一种递归方式快得多。