
C++20 引入了 ranges 库,它极大提升了处理容器和范围数据的表达力与安全性。相比传统 STL 算法中需要传入迭代器对的方式,ranges 提供了更简洁、可读性更强的操作方式,并支持链式调用和惰性求值。下面介绍如何使用 C++20 的 ranges 库,以及它的核心优势。
启用 C++20 和包含头文件
要使用 ranges,必须确保编译器支持 C++20 并开启相应标准。以 GCC 或 Clang 为例,编译时加上 -std=c++20 参数。
g++ -std=c++20 main.cpp -o main在代码中引入头文件:
#include
#include
#include iostream>
立即学习“C++免费学习笔记(深入)”;
基本用法:过滤、转换与遍历
ranges 支持通过管道操作符 | 将多个操作串联起来,语法直观。
例如,筛选出偶数并将其平方输出:
auto nums = std::vector{1, 2, 3, 4, 5, 6};
for (int n : nums | std::views::filter([](int i){ return i % 2 == 0; })
| std::views::transform([](int i){ return i * i; })) {
std::cout
}
输出:4 16 36
说明:
- std::views::filter 创建一个只包含满足条件元素的视图。
- std::views::transform 对每个元素进行变换。
- 所有操作返回的是 view,不会拷贝原始数据,开销小。
常用 views 操作示例
以下是几个常用的 view 操作:
- std::views::take(n):取前 n 个元素
- std::views::drop(n):跳过前 n 个元素
- std::views::reverse:逆序访问
- std::views::keys / std::views::values(用于 map)
示例:取前三个偶数的平方并逆序输出
auto result = nums
| std::views::filter([](int i) { return i % 2 == 0; })
| std::views::transform([](int i) { return i * i; })
| std::views::take(3)
| std::views::reverse;
这段代码构建了一个复合视图,实际遍历时才计算结果。
与传统 STL 的对比优势
使用 ranges 相比传统 STL 写法有以下明显优势:
- 可读性高:链式语法接近自然语言,逻辑清晰
- 减少迭代器错误:无需手动传递 begin/end,避免不匹配问题
- 惰性求值:view 不立即执行,只在遍历时按需计算,节省资源
- 组合灵活:多个 view 可自由拼接,易于复用
- 零成本抽象:编译器优化后性能与手写循环相当
比如传统写法需要临时存储或多层嵌套回调,而 ranges 一行即可表达复杂逻辑。
基本上就这些。C++20 ranges 让容器操作变得更安全、简洁和高效,特别适合数据流处理场景。只要环境支持 C++20,值得在新项目中优先采用。










