Modern C++ Ranges/View库简介
C++20 引入了 ranges 库, 这是标准模板库 (STL) 的一个重大改进. ranges 库引入了一种新的方式来处理序列(如数组、向量等), 使代码更加简洁和表达性更强.
环境要求
- 编译器需要支持 C++23 标准.
- 安装有 libfmt(version 10.0.0 或更高版本), 用于输出格式化的数据.
使用在线编译器
如果在本地环境无法运行, 可以使用在线编译器 Compiler Explorer. 这里有一个已经配置好的样例, 替换代码即可运行.
Ranges/View 简介
Ranges(范围)
Ranges 是 C++20 引入的新标准, 用于统一处理不同类型的序列容器, 提供了更直观的操作方式.
与传统 STL 对比, STL 通过 std::begin
和 std::end
获取迭代器, 手动遍历序列.
Ranges 直接操作范围对象, 代码更加简洁.
代码示例:
Views(视图)
C++ 的 Views 提供惰性计算, 能处理复杂的操作链.
ranges/view 的特点
惰性计算
视图操作(如 filter 或 transform)不会立刻执行, 而是在数据实际访问时才触发计算, 避免不必要的开销.
轻量级
只保有原始数据的引用, 不会复制数据, 降低内存开销.
组合式操作
视图支持通过管道运算符 (|
) 将多个操作串联起来, 如:
减少代码冗长性, 提升可读性.
不可变性
视图操作不会直接修改原始数据, 只返回一个新视图, 保持原始数据不变.
使用样例
过滤操作
可以使用 filter
操作过滤序列中的元素,
变换操作
可以使用 transform
操作对每个元素应用一个函数.
截取操作
take
操作可以从序列的开头截取指定数量的元素.drop
操作可以丢弃指定数量的元素.
zip 操作 (C++23)
zip
操作可以将两个序列合并为一个元素对序列.
zip_transform
操作可以将两个序列的元素应用一个函数.
枚举操作(C++23)
访问键值对
访问 tuple 的元素:
分割操作
使用split
操作可以将字符串分割为子字符串.
合并操作
使用join
操作可以将子字符串合并为一个字符串.
滑动窗口操作
slide
操作可以生成一个滑动窗口序列.
adjacent
操作与此有点像, 可以生成一个相邻元素对序列.
分块访问
chunk
操作可以将序列分块. 注意 chunk 之间没有重叠.
间隔访问
stride
操作可以按照指定的步长访问序列.
结论和总结
Ranges 和 Views 是 C++20 标准的重要组成部分, 为序列处理提供了更高层的抽象和更高效的实现. 它们通过统一的接口减少了对迭代器的直接依赖, 并通过惰性计算显著优化了性能. 尽管 ranges 提供了强大的功能, 但仍需注意其对编译器支持的要求(如 C++20 以上)以及一些尚未完全覆盖的边界情况.
参考链接
Tags: