打印出索引的所有组合 [英] print out all combinations of index

查看:92
本文介绍了打印出索引的所有组合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我设置了一个向量列表,例如:

I set a vector list, for example :

vector<VectorXi> Test;
Test.push_back(VectorXi(0,1));
Test.push_back(VectorXi(0,1,2));
Test.push_back(VectorXi(0));
Test.push_back(VectorXi(0,1));
Test.push_back(VectorXi(0,1,2,3));
PrintAllCombins(Test)

现在我想获取所有索引组合:

And now I want to get all combinations of indexes :

0, 0, 0, 0, 0
0, 0, 0, 0, 1
0, 0, 0, 0, 2
0, 0, 0, 0, 3

0, 0, 0, 1, 0
0, 0, 0, 1, 1
0, 0, 0, 1, 2
0, 0, 0, 1, 3

0, 0, 1, 0, 0
0, 0, 1, 0, 1
0, 0, 1, 0, 2
0, 0, 1, 0, 3

... and so on

如果我适当地使用for或while循环,那么我猜它可以工作,但遇到限制。有什么主意吗我正在用C和C ++编写代码

If i use for or while loop suitably, then it works I guess, but I encounter limitation. Is there any idea? I'm writing code in c and c++

---------------------代码:这是一个

--------------------- code : this is an example code that im using.

vector<VectorXi> Test;
VectorXi a0(2); a0[0] = 0; a0[1] = 1;
VectorXi a1(3); a1[0] = 0; a1[1] = 1; a1[2] = 2;
VectorXi a2(2); a2[0] = 0; a2[1] = 1;
VectorXi a3(4); a3[0] = 0; a3[1] = 1; a3[2] = 2; a3[3] = 3;
VectorXi a5(1); a5[0] = 0; 
Test.push_back(a0);
Test.push_back(a1);
Test.push_back(a5);
Test.push_back(a2);
Test.push_back(a3);

VectorXi index(5);
for (int i = 0; i < 5; i++)
    index[i] = 0;

int IndexTemp = Test.size()-1;
vector<VectorXi> result;
bool c = true;
while (c == true)
{
    if (index[IndexTemp] < Test[IndexTemp].size()-1)
    {
        VectorXi T;
        T.resize(Test.size());
        for (int j = 0; j<Test.size(); j++)
        {       
            T[j] = Test[j](index[j]);
        }
        result.push_back(T);
        index[IndexTemp] ++;
    }
    else if (index[IndexTemp] == Test[IndexTemp].size()-1)
    {
        VectorXi T;
        T.resize(Test.size());
        for (int j = 0; j<Test.size(); j++)
        {
            T[j] = Test[j](index[j]);
        }
        result.push_back(T);
        IndexTemp--;
        if (IndexTemp < 0)
            break;
        index[IndexTemp] ++;
    }

}


for (unsigned int i = 0; i < result.size(); i++)
{
    cout << i << " : ";
    for (unsigned int j = 0; j < result[i].size(); j++)
    {
        cout << result[i](j) << " ";
    }
    cout << endl;
}

现在不显示所有组合。

如果我使代码仅适用于此示例(Test.size()== 5)
我只使用了五次循环:

If I make code to work only to this example (Test.size() == 5) I just use for loop five times like :

for(Test[0].size())
    for(Test[1].size())
        for(Test[2].size())
            for(Test[3].size())
                for(Test[4].size())
                    cout << ~~~~~

然后给出所有组合。
但是,如果Test.size()增加,则无法手动编写所有for循环。

Then it gives all combinations. However if the Test.size() increased, I cannot write all for loops manually.

推荐答案

您可以这样做:

bool increase(const std::vector<std::vector<int>>& v, std::vector<std::size_t>& it)
{
    for (std::size_t i = 0, size = it.size(); i != size; ++i) {
        const std::size_t index = size - 1 - i;
        ++it[index];
        if (it[index] >= v[index].size()) {
            it[index] = 0;
        } else {
            return true;
        }
    }
    return false;
}

void do_job(const std::vector<std::vector<int>>& v,
            const std::vector<std::size_t>& it)
{
    for (std::size_t i = 0; i != it.size(); ++i) {
        // TODO: manage case where v[i] is empty if relevant.
        std::cout << v[i][it[i]] << " ";
    }
    std::cout << std::endl;
}

void iterate(const std::vector<std::vector<int>>& v)
{
    std::vector<std::size_t> it(v.size(), 0u);

    do {
        do_job(v, it);
    } while (increase(v, it));
}

实时演示

这篇关于打印出索引的所有组合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆