c++++20 的 ranges 提供更直观、简洁的数据处理方式。1. 它通过 std::ranges 命名空间下的算法,直接作用于整个容器,减少重复代码和错误;2. 引入视图(views),支持链式操作如 filter、transform、take 等,高效处理数据而不产生临时容器;3. 支持范围友好的算法,提升语义清晰度与模板推导稳定性,并可结合视图使用;4. 使用时需确保编译器支持 c++20,推荐从简单操作逐步尝试组合多个视图。

C++20 的 Ranges(范围)库是对 STL 中迭代器和算法的扩展,它引入了更直观、简洁的方式来处理集合类型的数据。相比传统的 STL 编程方式,Ranges 提供了更高的抽象层次,让代码更易读、更安全,也更容易组合。

什么是 STL 范围操作?
STL 原来的设计是基于“容器 + 迭代器 + 算法”的模式。你需要手动传入 begin 和 end 迭代器来调用算法,比如:

std::sort(vec.begin(), vec.end());
这种方式虽然灵活,但写起来重复性高,而且容易出错。而 C++20 的 ranges 允许你这样写:
立即学习“C++免费学习笔记(深入)”;
std::ranges::sort(vec);
这不仅更简洁,还减少了因误操作导致 bug 的可能性。

更直观的链式操作:视图(views)
Ranges 最吸引人的一个特性就是“视图”(views),它可以让你对数据进行一系列变换,而不实际修改原始数据。例如,你可以轻松地过滤、映射、截取一部分数据,然后把这些操作串联起来。
举个例子:
auto result = vec | std::views::filter([](int x) { return x > 10; })
| std::views::transform([](int x) { return x * 2; });这段代码会先选出大于 10 的元素,再将它们乘以 2,最终结果是一个新的视图。注意,这个过程不会创建临时容器,效率很高。
常见使用场景包括:
- 对容器中的元素做条件筛选(filter)
- 数据转换(transform)
- 截取部分数据(take、drop)
- 排序或去重(sort、unique)
支持范围友好的算法
C++20 的 std::ranges 命名空间下提供了一整套“范围友好型”算法。这些算法可以直接作用于整个容器,而不是迭代器区间。
比如:
// 传统写法 std::find_if(v.begin(), v.end(), pred); // 使用 ranges std::ranges::find_if(v, pred);
这样的好处在于:
- 更少的模板参数推导错误
- 更清晰的语义表达
- 可以结合视图一起使用
如何开始使用 Ranges?
如果你已经在用 C++20,那就可以直接尝试这些功能了。不过要注意以下几点:
- 编译器支持情况:GCC 10+、Clang 13+、MSVC 19.28+
- 需要启用 C++20 标准(编译时加上
-std=c++20) - 某些复杂视图可能在调试时不太方便查看内部状态
建议从简单的排序、查找和视图操作入手,逐步尝试组合多个操作。
基本上就这些。Ranges 并不复杂,但在日常开发中能显著提升代码可读性和安全性,尤其是在需要链式处理数据的时候。










