gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:26 25 4
gpt4 key购买 nike

这个问题是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com