You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 14:15:02