如何生成任意数量矢量的裁决组合
How to generate tupled combinations of arbitrary number of vectors
以前有一个问题,但我不确定是否真的提供了令人满意的回答。对我来说,我对降落在std::string
的std::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是完成任务的必要条件。
不能保证A
,B
或C
彼此有任何关系,更不用说转换为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
相关文章:
- 生成组合的虚拟按键以获得 â、ó、ć 等字符
- tic tac脚趾生成板的组合C
- 递归生成给定子集大小 (C++) 的所有组合
- 如何生成任意数量矢量的裁决组合
- C :在新基础中生成组合
- 使用两个列表中的组合生成函数调用
- 如何从数组中生成组合
- 如何组合两个单独的生成文件来编译程序
- 设计生成所有 n 位数字组合的递归函数的最佳方法是什么?
- 为循环嵌套的变量快速生成数字组合
- 生成k数字的NCK组合的程序从1到n不等
- 排列和组合生成算法
- 如何在两个动态生成的组合蛋白上使用不同的值
- 组合 fltk 和 C++ 文件的生成文件
- 生成每个可能的 7 位数字组合的算法
- C++生成组合键 WINAPI(无 MFC)
- 在C++中生成组合列表的最简单方法是什么?
- 使用递归和回溯生成所有可能的组合
- 生成所有二进制组合C++
- 我可以从random_device和mt19937的组合中生成加密安全的随机数据吗