我有许多User类型的变量。此类型的所有对象都位于一个集合中。这些变量的数量没有修复,因此我只能在运行时确定它。因此,我有一个可变数量的迭代器。我将它们保存在以下列表中。
list<set<User>::iterator> userIterators;
for (unsigned int i = 0; i < numberOfUserParameters; i++) {
userIterators.push_back(q->getUserSet()->getUsers().begin()); }
现在我需要获得这些n个UserIterator的所有可能组合。 (我知道它的计算复杂性。)
当然,如果我只有四个参数,我会编写四个嵌套循环但是在这个带有n个参数的变量情况下我该怎么做?
提前致谢!
这是一个例子。
numberOfUserParameters = 3,设置&lt;用户&gt; = {U1,U2}
所以我希望所有三元组都设置为&lt;用户&gt; X set&lt;用户&gt; X set&lt;用户&gt ;,笛卡尔积和其他词。
答案 0 :(得分:0)
快速解决方案:
int num_iters = 4; //something random
int max_index = 2; //something random too
std::vector<int> indices(num_iters);
do
{
for(int i=0; i<num_iters; ++i)
{
if(indices[i]<max_index)
{
++indices[i];
break;
}
else
{
indices[i] = 0;
}
}
//here use indices as your current combination, e.g.
for(int i=0;i<num_iters;++i)
{
std::cout<<indices[i]<<" ";
}
std::cout<<std::endl;
}
while(!std::all_of(indices.begin(), indices.end()
, [max_index](auto x) { return x == max_index; }));
您可以进一步将此逻辑从离散索引转换为您的集合(而我更倾向于使用vector
迭代器而不是set
) - 只需替换check {{1通过对indices[i]<your_size-1
的测试,以及通过.end()
的作业划分的行indices[i] = 0
。