1. C++20 ranges库概述
C++20引入的ranges库是对传统STL算法和迭代器体系的重大革新。这个库通过提供更高级的抽象,让序列操作变得更直观、更安全。想象一下,以前我们需要写一堆begin/end迭代器对,现在可以直接操作整个数据范围,就像操作一个整体对象一样。
ranges库的核心思想是"视图"(view)——一种轻量级的、非拥有的范围表示。视图不会复制底层数据,只是提供了一种访问数据的新方式。比如你可以创建一个过滤视图,只显示满足条件的元素;或者创建一个转换视图,对每个元素应用某种变换。
关键提示:视图是惰性求值的,这意味着在你真正遍历它们之前,不会执行任何实际计算。这种特性使得视图组合非常高效。
2. ranges核心组件解析
2.1 范围概念体系
ranges库定义了一套完整的概念体系来分类不同类型的范围:
input_range:最基本的范围概念,支持单次遍历forward_range:支持多次遍历bidirectional_range:支持双向遍历random_access_range:支持随机访问contiguous_range:元素在内存中连续存储sized_range:可以在常数时间内获取元素数量
这些概念通过C++20的concepts特性实现,编译器会在编译期检查类型是否满足特定概念的要求。例如:
cpp复制template<std::ranges::input_range R>
void process_range(R&& r) {
// 只接受满足input_range概念的类型
}
2.2 视图适配器
视图适配器是ranges库最强大的特性之一,它们可以像管道一样串联起来:
cpp复制auto result = data | std::views::filter(pred)
| std::views::transform(fn)
| std::views::take(10);
常用视图适配器包括:
filter:只保留满足谓词的元素transform:对每个元素应用转换函数- `t
