2015-04-27 28 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