如何生成任意数量矢量的裁决组合

How to generate tupled combinations of arbitrary number of vectors

本文关键字:组合 何生成 任意数      更新时间:2023-10-16

以前有一个问题,但我不确定是否真的提供了令人满意的回答。对我来说,我对降落在std::stringstd::vector本身不感兴趣,而是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循环,但是,我想通过函数,如果可能的话进行模板函数,那么我想variadic是完成任务的必要条件。

不能保证ABC彼此有任何关系,更不用说转换为std::string,就像几个响应中提出的那样。

我想说的是可以有一个变化的解决方案,但是我不确定如何构成std::vector<T>std::vector<T>::value_type定义。

如果要计算异质向量的笛卡尔产品,则可以做类似:

的事情
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