如何使用C++20 ranges优雅实现嵌套for循环的扁平化
C++20 Ranges 扁平化双层嵌套循环的更简洁实现
你当前使用std::views::transform + std::views::join + std::ranges::for_each的写法已经是C++20标准下非常规范的Ranges风格实现,还有两种更贴近原生循环书写习惯的精简方案:
方案1:范围for配合视图管道(C++20 原生支持)
直接用范围for遍历拉平后的视图,省去手写lambda的冗余:
for (const char ch : persons | std::views::transform(&Person::name) | std::views::join) { std::cout << ch << '\n'; }
- 补充优化:把
std::endl替换为'\n',可以避免不必要的强制缓冲区刷新,提升输出性能 - 如果项目编码规范允许引入视图命名空间,可以进一步简化前缀:
using namespace std::views; for (const char ch : persons | transform(&Person::name) | join) { std::cout << ch << '\n'; }
方案2:C++23 适配场景(可选)
如果可以升级到C23标准,针对更复杂的多层嵌套场景,还可以配合std::views::cartesian_product、std::views::join_with等特性进一步简化,但针对你当前的两层遍历场景,C20的写法已经足够精简。
所有上述实现和原生双层for循环性能完全一致,全程没有额外的对象拷贝,只是语法层面的扁平化封装。
内容的提问来源于stack exchange,提问作者NoSenseEtAl
相关产品推荐
相关产品推荐

