这个问题是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));
}
关于c++ - 如何生成任意数量 vector 的元组组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47934050/