簡體   English   中英

打印所有可能的組合,包括重復的訂單,也很重要

[英]Printing all possible combinations including duplicates, order matters too

我正在嘗試將兩個集合(向量)組合成一個大的集合,使兩個集合的所有元素都包括重復項。

例如:

setA =“ abc”,setB為“ 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());
            }
        }
    }

但是,如果第一個元素的數量增加,則它將不起作用。 請問有人可以幫助創建遞歸函數嗎?

該函數應使用兩個集合(例如“ 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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM