我正在尝试使用STL的样式创建一个函数来生成可变数量输入范围的笛卡尔积.我的基本格式是函数接受固定范围和输出范围的开始,然后是可变数量的双向输入迭代器.
template <
typename BidirectionalIterator,
typename OutputIterator,
typename... Args
>
void cartesian_product(
BidirectionalIterator first,
BidirectionalIterator last,
OutputIterator result,
Args&&... args
);
Run Code Online (Sandbox Code Playgroud)
我的想法args是我从中做出一个tuple,然后我遍历它tuple以提取元素.这需要我遵循几个基本步骤:
tuple来自argstupletuple按顺序递增每个迭代器,以便我们获得范围中值的所有可能组合.详细说明第3步:如果我们有两组A = {0,1}和B = {2,3},则笛卡尔乘积A x B = {(0,2),(0,3),(1, 2),(1,3)}.
我可以做第一步:
auto arg_tuple = std::make_tuple(std::forward<Args>(args)...);
Run Code Online (Sandbox Code Playgroud)
第二步,我不太确定.我想我会以某种方式将push_back元素转换为临时元组,然后将其设置为*result等于临时元组.我对ostream实现这一目标的方式有点启发,所以我认为这可以派上用场:
template <typename Tuple, typename T>
auto operator<<(const Tuple &lhs, const T &rhs)
-> decltype(std::tuple_cat(lhs, std::make_tuple(rhs)))
{
return std::tuple_cat(lhs, std::make_tuple(rhs));
}
Run Code Online (Sandbox Code Playgroud)
第三步可能非常简单.我可以结合这样的事情:
template …Run Code Online (Sandbox Code Playgroud)