2015-04-27 31 views
0

我想將兩個集合(向量)合併成一個包含重複元素的所有元素。打印所有可能的組合,包括重複,順序也很重要

例如:

組A = 「ABC」 和組B具有 「12345」 我的輸出需要看起來像這樣:

{(a,1)(b,1)(c,1)} 
{(a,1)(b,1)(c,2)} 
{(a,1)(b,1)(c,3)} 
{(a,1)(b,1)(c,4)} 
{(a,1)(b,1)(c,5)} 
{(a,1)(b,2)(c,1)} 
{(a,1)(b,2)(c,2)} 
{(a,1)(b,2)(c,3)} 
{(a,1)(b,2)(c,4)} 
{(a,1)(b,2)(c,5)} 
{(a,1)(b,3)(c,1)} 
{(a,1)(b,3)(c,2)} 
.................  
{(a,5)(b,3)(c,5)} 
{(a,5)(b,4)(c,1)} 
{(a,5)(b,4)(c,2)} 
{(a,5)(b,4)(c,3)} 
{(a,5)(b,4)(c,4)} 
{(a,5)(b,4)(c,5)} 
{(a,5)(b,5)(c,1)} 
{(a,5)(b,5)(c,2)} 
{(a,5)(b,5)(c,3)} 
{(a,5)(b,5)(c,4)} 
{(a,5)(b,5)(c,5)} 

所有125件(5 * 5 * 5)

我試圖與for循環

for (size_t i = 0; i < v_setB.size(); i++) 
    { 
     for (size_t k = 0; k < v_setB.size(); k++) 
     { 
      for (size_t n = 0; n < v_setB.size(); n++) 
      { 
       stringstream temp; 
       temp << "{(" << v_setA[0] << "," << v_setB[i] << ")(" << v_setA[1] << "," << v_setB[k] << ")(" << v_setA[2] << "," << v_setB[n] << ")}"; 
       v_SavedElem.push_back(temp.str()); 
      } 
     } 
    } 

,但如果要做到這一點在第一組元素#增長,那麼它不會工作。有人可以幫助創建遞歸功能嗎?

+0

你對矢量迭代器感到滿意嗎?該解決方案可以或不可以使用,但他們是一個很好的習慣。 – Beta

+0

當你說在第一組中有更多元素時,解決方案「不起作用」 - 你是什麼意思?我有一個非常強烈的懷疑,遞歸不是你的問題的答案。 – YePhIcK

+0

你能告訴我在哪裏看,或者如果可能的話顯示一些代碼 – user117911

回答

0

該函數應該採用兩組(例如「abc」和「12345」)作爲參數,並生成您描述的字符串。

那麼怎麼樣:給它一個第三個參數 - 或者最好還是第一個參數 - 它是一個字符串,用作這些字符串的前綴。另一個用於目的地矢量。

該函數從setA中移除第一個元素,並將其附加到前綴字符串中。然後它遍歷setB中的元素,並保存結果或再次調用該函數(使用較短的setA)。

void foo(string pref, vector<char> v_setA, vector<char> v_setB, vector<string> &v_SavedElem) 
{ 
    vector<char>::iterator itrA = v_setA.begin(); 
    pref += "("; 
    pref += *itrA; 
    pref+= ","; 

    v_setA.erase(itrA); 

    for(vector<char>::iterator itrB = v_setB.begin(); itrB!=v_setB.end(); ++itrB) 
    { 
     if(v_setA.empty()) 
     { 
     stringstream temp; 
     temp << pref << *itrB << ")}" << endl; 
     v_SavedElem.push_back(temp.str()); 
     } 
     else 
     foo(pref+*itrB+")", v_setA, v_setB, v_SavedElem); 
    } 
} 
+0

是的!非常感謝你,你的代碼很容易理解。 – user117911