2015-05-04 40 views
0

我認爲這是一個經典問題,但我沒有找到適合我的問題的答案。 我有兩個'MyObject'向量,我想遍歷第一個向量的元素與第二個元素的所有可能組合,並將所有情況分開處理。 (第二個向量可能比第一個向量更多)。 這裏是我目前在做什麼僞代碼測試所有組合(C++)

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 
     } 
    } 
} 

在這裏,我認爲是向量1小於或等於vector2。所以我給這兩個向量之間的每一對'MyObject'賦值,如果剩下一些元素,我會再次遞歸地執行。我的問題是我必須複製矢量每次遞歸,因爲我無法刪除矢量上的一個循環期間的對象...我的問題是:這是做正確的方式,還是我完全瘋狂?

感謝您的幫助

編輯:輸出爲兩個列表[a,b,c][1,2,3,4]是:

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

做一個普通的雙'for'有什麼問題?爲什麼遞歸? – Quentin

+0

double for循環會給我vector1的一個元素與vector2的一個元素之間的所有組合,但不是vector1的整個元素集合與vector2的整個元素集合的所有組合。 (或者,也許我設計得這麼差) – Arcyno

+0

你的意思是連接'vec1'和'vec2',然後洗牌得到的'vec3'?或者也許洗牌然後連接?我無法理解你的目標。 – Quentin

回答

0

其實我覺得使用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())); 
} 

在我看來,它和以前完全一樣,但在一個很簡單呃方式。

+0

這裏唯一的是,如果vector2.size()> vector1.size(),我會得到幾個時間相同的組合(當我得到一個排列範圍外的排列)...但它不是問題在我的情況。 而我的測試表明,它似乎比第一個遞歸方式快得多。 – Arcyno