测试所有组合 (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()));
}
在我看来,它做的事情与以前完全相同,但方式更简单。
我认为这是一个经典问题,但我没有找到适合我问题的答案。 我有两个 '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()));
}
在我看来,它做的事情与以前完全相同,但方式更简单。