1. C++20 ranges 概述
C++20 引入的 ranges 库彻底改变了我们处理序列数据的方式。传统 STL 算法需要传递开始和结束迭代器对,而 ranges 提供了更高级的抽象——将整个序列作为单一实体处理。这种范式转变不仅简化了代码,还带来了更强的表达能力和编译时安全性。
关键区别:传统
std::sort(vec.begin(), vec.end())现在可以写成std::ranges::sort(vec),减少了重复和潜在错误。
ranges 的核心是三个概念:
- 范围(Range):可迭代的元素集合
- 视图(View):对范围的惰性转换
- 适配器(Adapter):组合操作的工具
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 范围概念深度解析
2.1 基本范围类型
C++20 定义了六种范围概念层次:
-
input_range:可单次前向遍历
cpp复制template <typename T> concept input_range = requires(T& t) { { begin(t) } -> input_iterator; { end(t) } -> sentinel_for<decltype(begin(t))>; }; -
forward_range:可多次前向遍历(如
std::forward_list) -
bidirectional_range:支持双向遍历(如
std::list) -
random_access_range:支持随机访问(如
std::vector) -
contiguous_range:元素内存连续(如
std::array) -
output_range:支持写入操作
2.2 范围适配器实战
视图适配器通过管道运算符 | 组合:
cpp复制auto result = data
| views::filter([](auto x) { return x % 2 == 0; })
| views::transform([](auto x) { return x * x; })
| views::take(10);
典型适配器包括:
filter:条件过滤transform:元素转换take/drop:取前N个/跳过前N个reverse:逆序视图split:按分隔符拆分
3. 范围算法详解
3.1 与传统算法对比
传统算法:
cpp复制std::sort(vec.begin(), vec.end()); // 需明确指定范围边界
范围算法:
code复制
