如何从不同的组成员获得笛卡尔积? 正如标题所提到的,C++中存在一些问题。

如何从不同的组成员获得笛卡尔积? 正如标题所提到的,C++中存在一些问题。,c++,algorithm,vector,cartesian-product,C++,Algorithm,Vector,Cartesian Product,如果我有一个std::vectortmpvec 最多有48种不同的组合。您可以这样做 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

如果我有一个std::vectortmpvec

最多有48种不同的组合。

您可以这样做

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

看到@jackson了吗?你打算怎么处理排列?我想选择每个组的头作为中继@πάνταῥεῖ: 事实上,op want.thx但是代码不能在我的笔记本上运行QQ我可以问一个关于itv.size,0u的问题吗。0u在这里是什么意思?0u是0未签名。如果您愿意,您可以在这里使用0。@jackson:演示仅在初始化初始向量时使用C++11。您可以轻松地替换它以使用C++03。
1,4,6,10

1,4,6,11

1,4,7,10

1,4,7,11

......
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));
}