[英]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.