C ++:获取n迭代器的所有组合

时间:2017-06-23 05:21:40

标签: c++ collections iterator

我有许多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 ;,笛卡尔积和其他词。

1 个答案:

答案 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; }));

DEMO

您可以进一步将此逻辑从离散索引转换为您的集合(而我更倾向于使用vector迭代器而不是set) - 只需替换check {{1通过对indices[i]<your_size-1的测试,以及通过.end()的作业划分的行indices[i] = 0