
C++20 引入了 Ranges 库,极大简化了对容器和范围的操作。相比传统的 STL 算法(如 std::sort、std::find_if),Ranges 提供更安全、可读性更强的链式语法,并支持惰性求值。下面介绍如何启用并使用 C++20 Ranges,以及常见语法与实用示例。
启用 C++20 和 Ranges 支持
要使用 Ranges,需确保编译器支持 C++20 并开启对应标准:
g++ -std=c++20 your_file.cppclang++ -std=c++20 your_file.cpp
同时包含头文件:
#include#include
#include iostream>
基本语法:views 与管道操作符
Ranges 的核心是 view —— 轻量、惰性计算的范围适配器。通过管道操作符 | 可以链式组合多个操作。
立即学习“C++免费学习笔记(深入)”;
例如:筛选偶数并平方输出
for (int n : nums | std::views::filter([](int x) { return x % 2 == 0; })
| std::views::transform([](int x) { return x * x; })) {
std::cout }
// 输出: 4 16 36
说明:
-
std::views::filter接收一个谓词函数,保留满足条件的元素 -
std::views::transform对每个元素应用变换函数 - 整个表达式是惰性的,只有在遍历时才计算结果
常用 views 操作示例
以下是一些常用的 view 适配器及其用途:
1. take / drop:取前 N 个或跳过前 N 个
auto result = nums | std::views::take(3); // 取前3个: 1,2,3
auto rest = nums | std::views::drop(2); // 跳过前2个: 3,4,5,6
2. reverse:反转顺序
for (int n : nums | std::views::reverse) {
std::cout
}
// 输出: 6 5 4 3 2 1
3. join:展平嵌套范围
std::vector<:string>words = {"hello", "world"};
for (char c : words | std::views::join) {
std::cout
}
// 输出: h,e,l,l,o,w,o,r,l,d,
4. common_view:确保 range 可以用作传统迭代器接口
auto filtered = nums | std::views::filter([](int x){return x>3;})
| std::views::common;
std::vector
自定义数据处理流水线
结合多种 view,可以构建清晰的数据处理流程。
std::vectorauto pipeline = data
| std::views::filter([](int x) { return x > 0; }) // 去负数
| std::views::transform([](int x) { return x * x; }) // 平方
| std::views::take(3); // 取前三
for (int val : pipeline) {
std::cout
}
// 输出: 1 9 25
这种写法逻辑清晰,避免中间临时容器,性能更好。
注意事项与限制
- Views 是惰性的,不会立即执行;必须被遍历或转换为容器才会计算
- 某些 view(如 filter)返回的是“非连续”范围,不能直接用
.data()或传给需要连续内存的 API - 生命周期注意:view 不持有数据,原容器必须在使用期间保持有效
- 并非所有编译器完全支持所有 view 特性,建议使用较新版本 GCC 12+/Clang 14+
基本上就这些。C++20 Ranges 让集合操作更接近函数式风格,代码更简洁易懂。掌握基础 view 和管道语法后,能显著提升日常编码效率。











