如何使用std::ranges将C++多层嵌套for循环改写为单行表达式?
答案
完全可以实现,核心是借助C++20引入的std::ranges相关视图工具对嵌套容器做扁平化处理,替代嵌套循环的同时保持和原生循环一致的惰性求值效率,匹配到目标元素后会立刻停止遍历。
具体实现分两种标准版本:
C++23 版本(支持带投影的
join接口,写法最简洁)
你需要把代码里的A/B/C替换为a/b/c变量对应的实际类型,target替换为你要匹配的d.e的目标值即可:auto it = std::ranges::find_if(x.as | std::views::join(&A::bs) | std::views::join(&B::cs) | std::views::join(&C::ds), [](const auto& d) { return d.e == target; }); // 拿到迭代器后就可以按原有逻辑返回对应内容,比如返回*it或者it对应的属性C++20 版本(
join不支持投影,额外加transform层即可)auto it = std::ranges::find_if(x.as | std::views::transform(&A::bs) | std::views::join | std::views::transform(&B::cs) | std::views::join | std::views::transform(&C::ds) | std::views::join, [](const auto& d) { return d.e == target; });
如果你的原有逻辑是匹配到目标就直接返回d的某个属性,还可以继续在视图链条后追加std::views::transform和std::views::take(1),整行逻辑会更紧凑。
内容的提问来源于stack exchange,提问作者vvoodrovv
相关产品推荐
相关产品推荐

