Z
ZHANK
编程在线教程C++ 教程C++20 Ranges 范围库
并发与模板进阶

C++20 Ranges 范围库

ranges::filter/transform、管道操作符 |、视图适配器

C++20 Ranges 范围库

Ranges 给 STL 加上了管道操作符 |——集合处理变得像 Unix 管道一样流畅。

学完本章你将: 掌握 ranges::filter/transform、管道 |、视图适配器。


从算法到 Ranges

cpp
#include <ranges>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    // 旧式 STL(需要 begin/end 对)
    auto it = std::find_if(v.begin(), v.end(), [](int n) {
        return n > 5;
    });

    // Ranges(直接传容器)
    auto it2 = std::ranges::find_if(v, [](int n) { return n > 5; });
}

管道操作符 |

cpp
auto result = v
    | std::views::filter([](int n) { return n % 2 == 0; })  // 保留偶数
    | std::views::transform([](int n) { return n * n; })     // 平方
    | std::views::take(3);                                   // 取前 3 个

for (int n : result)
    std::cout << n << " ";  // 4 16 36

常用视图

cpp
std::views::filter(pred)      // 过滤(不是 map!)
std::views::transform(fn)     // 映射
std::views::take(n)           // 取前 n 个
std::views::drop(n)           // 跳过前 n 个
std::views::reverse           // 反转
std::views::iota(0, 10)       // 生成 [0, 10)
std::views::keys / ::values   // pair/map 的 key/value
std::views::split(delimiter)  // 分割

💡 视图是惰性求值的——管道定义时不执行,遍历时才计算。和 LINQ 一样。