C++ 范围视图的惰性组合

The*_*moo 5 c++ algorithm range c++20

我正在寻找一种范围视图的实现,它可以懒惰地创建给定范围的 k 个组合。

例如,{1, 2, 3}具有 2 个组合的范围应返回:

std::vector v {1,2,3};
auto rng = ranges::views::combinations<2>(v);
for(auto[a,b] : rng)
  std::cout << a << ' ' << b << '\n';
// 1, 2
// 1, 3
// 2, 3
Run Code Online (Sandbox Code Playgroud)

非常类似于 Pythonsitertools.combinations()模块。

我从这个问题中找到了实现。但它们不是针对范围的,也不是懒惰的。

解决方案

由于这个问题的答案,我目前的解决方案:

std::vector v {1,2,3};
auto rng = ranges::views::combinations<2>(v);
for(auto[a,b] : rng)
  std::cout << a << ' ' << b << '\n';
// 1, 2
// 1, 3
// 2, 3
Run Code Online (Sandbox Code Playgroud)

关联

Sur*_*urt 3

让“一切”变得懒惰

完全未经测试的代码

auto lazycombo = [values, comb_size]() mutable { 
  bool ok = next_combination(values.begin(), values.begin() + comb_size, values.end());
  return std::span(values.begin(), values.begin()+comb_size);
}
Run Code Online (Sandbox Code Playgroud)

请参阅next_combination

现在使用您的

auto combinationIdx = ranges::views::generate(lazycombo);
Run Code Online (Sandbox Code Playgroud)

其中 应该是generate_n因为没有办法停止generate,其中n应该是可能的组合数。。