C++嵌套容器初始化两种实现哪种代码可读性更优?
你的判断完全正确
标准库算法的核心优势是表意优先,而非「只要用算法就一定更好」。
你原来的std::fill_n版本存在两个明显的可读性问题:
- 需要额外构造
per_zone、per_system两个临时对象作为填充模板,读者需要顺次理解三层填充的逻辑才能get到最终效果是所有zone设为false - 额外提一句:原写法用
capacity()而非size()作为填充长度,如果容器实际大小小于容量时会触发越界访问,属于潜在UB
而你重构的三层范围for循环逻辑完全平铺,一眼就能看出是遍历整个嵌套结构的最内层元素赋值,没有任何理解负担,可读性远高于原始的fill_n实现,这个取舍非常合理。
标准库算法的可选实现
如果想要用标准库算法实现同等甚至更高的可读性,在C++20及以上版本可以用范围库(ranges)打平嵌套结构:
#include <ranges> #include <algorithm> auto all_zones = m_pMemory->TrackingZonesShowingLogicalParcels | std::views::join | std::views::join; std::ranges::fill(all_zones, false);
这段代码通过两次join视图把三层嵌套的容器直接拍平为所有zone元素的一维视图,之后直接调用fill赋值false,表意也非常直接,和手写三层for的可读性不分伯仲,优势是代码更短、不需要手动写多层循环嵌套。
如果是C++17及更早的版本,没有ranges支持的前提下,非要用标准库算法只能嵌套调用std::for_each,写出来的代码比三层范围for更啰嗦、可读性更差,完全没有必要替换你现在的实现。
内容的提问来源于stack exchange,提问作者Dundo
相关产品推荐
相关产品推荐

