此文章可能引起不适,如果有路过的只写过 C++ 的脑残傻逼别点进来。

C++20 加入了 Ranges,C++23又补充了一堆东西。理论上 Ranges 解耦了迭代和计算的逻辑,抽象出「范围」的概念,使得相比于旧的 Algorithm 库,Range 库中的算法更容易被组合,可以写出更清晰、优雅、美观、运行效率更高的代码。

但实际上…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
auto c = std::views::iota(1, 5)
        | std::views::transform([](int const v){
                return std::views::iota(1, 3)
                    | std::views::transform([v](int const w){
                            return std::make_pair(v, std::format("[{}/{}]", v, w));
                    });
        })
        | std::views::join
        | std::views::common
        | std::ranges::to<std::map>();

这是什么瘠薄东西?一言难尽,下面是Rust等效代码。没有对比就没有伤害。

1
2
3
let c = (1..5)
        .flat_map(|v| (1..3).map(move |w| (v, format!("[{v}/{w}]"))))
        .collect();

Ranges 特性确实很重要,其它语言 swift/kotlin 等等早有标准化的对应物。C++早的时候不搞,还以为在酝酿什么绝招,没想到拉了泼大的,nmd 整些什么 | 好像尼玛古代 unix 遗精糟粕一样。