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)
让“一切”变得懒惰
完全未经测试的代码
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
应该是可能的组合数。。
归档时间: |
|
查看次数: |
304 次 |
最近记录: |