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 一样。