c++ - 如何生成任意数量 vector 的元组组合

标签 c++ combinatorics cartesian-product

这个问题是kind of asked before ,但我不确定是否真的提供了令人满意的答复。对我来说,我对登陆std::vector不感兴趣。的std::string ,本身,而是 std::tuple .

例如,如果我有 std::vector<A> , std::vector<B> ,和std::vector<C> ,那么我预计也许std::vector<std::tuple<A, B, C>> 。或者,甚至std::set<std::tuple<A, B, C>> ,如果这样更合适的话。

现在,我可以对嵌套 for 进行编码循环,但是,我想通过函数、模板函数(如果可能的话)来完成此操作,那么我想需要使用可变参数来完成该任务。

无法保证 A , B ,或C彼此有什么关系,更不用说转换为 std::string ,正如一些回复中所提议的那样。

我想说可能有一个可变的解决方案,但我不太确定如何编写 std::vector<T>std::vector<T>::value_type定义。

最佳答案

如果你想计算异构 vector 的笛卡尔积,你可以这样做:

template <std::size_t N>
bool increase(const std::array<std::size_t, N>& sizes, std::array<std::size_t, N>& it)
{
    for (std::size_t i = 0; i != N; ++i) {
        const std::size_t index = N - 1 - i;
        ++it[index];
        if (it[index] >= sizes[index]) {
            it[index] = 0;
        } else {
            return true;
        }
    }
    return false;
}

template <typename F, std::size_t ... Is, std::size_t N, typename Tuple>
void apply_impl(F&& f,
                std::index_sequence<Is...>,
                const std::array<std::size_t, N>& it,
                const Tuple& tuple)
{
    f(std::get<Is>(tuple)[it[Is]]...);
}

template <typename F, typename ... Ts>
void iterate(F&& f, const std::vector<Ts>&... vs)
{
    constexpr std::size_t N = sizeof...(Ts);
    std::array<std::size_t, N> sizes{{vs.size()...}};
    std::array<std::size_t, N> it{{(vs.size(), 0u)...}};

    do {
        apply_impl(f, std::index_sequence_for<Ts...>(), it, std::tie(vs...));
    } while (increase(sizes, it));
}

Demo

关于c++ - 如何生成任意数量 vector 的元组组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47934050/

相关文章:

c++ - bjam 找不到 boost 库

c++ - g++: optimization -march=haswell and newer changes 数值结果

c++ - QF模式匹配算法伪代码转c代码

c++ - 如何在实际二进制位前面附加十六进制字节

python:生成整数分区

php - 我怎样才能完成这个笛卡尔乘积函数的 Objective-C 实现?

combinatorics - 游戏拼图 : Blindfolded coin flipping with adversary

r - 如何在 R 中编写帕斯卡三角形的程序?

c# - 从 2 个表中选择行的所有组合

java - 在 Java 中查找笛卡尔积