7.8小学期基础语法记录
ranges库
C++20 引入的 <ranges> 库极大增强了 C++ 对容器的操作能力,核心目标是:更简洁、更安全、更组合式的容器处理方式,类似于函数式编程中“管道”风格。
🔑 一、std::ranges 的核心组成
| 分类 | 内容 |
|---|---|
| ✅ 范围算法(algorithms) | ranges::sort, ranges::find, ranges::copy, ranges::for_each 等 |
| ✅ 范围视图(views) | views::filter, views::transform, views::take, views::drop, views::reverse 等 |
| ✅ 范围适配器(adaptors) | 支持 ` |
| ✅ 范围概念(concepts) | ranges::range, ranges::view, ranges::input_range,用于泛型约束 |
🧩 二、常用算法(std::ranges::xxx)
这些是 C++20 为 ranges 提供的算法接口,使用方式类似于 std::sort(),但直接操作容器,更安全:
🔧 常用范围算法(与 std::xxx 一一对应)
| 算法 | 功能 | 示例 |
|---|---|---|
ranges::sort |
排序 | ranges::sort(vec) |
ranges::find |
查找元素 | ranges::find(vec, 3) |
ranges::count |
计数 | ranges::count(vec, 2) |
ranges::copy |
拷贝 | ranges::copy(src, dest.begin()) |
ranges::for_each |
遍历操作 | ranges::for_each(vec, f) |
ranges::equal |
判断两个范围是否相等 | ranges::equal(v1, v2) |
ranges::unique |
去重(返回去重后的迭代器) | auto [first, last] = ranges::unique(vec) |
🔮 三、核心视图(std::views::xxx)
视图是懒惰求值的容器处理操作,类似 Python 的生成器:
🚀 管道式组合能力极强:
auto result = vec
| views::filter([](int x){ return x % 2 == 0; })
| views::transform([](int x){ return x * x; })
| views::take(3);
🌟 常用视图操作汇总
| 视图名 | 功能 |
|---|---|
views::filter |
过滤满足条件的元素 |
views::transform |
映射,每个元素映射为新值 |
views::take(n) |
取前 n 个元素 |
views::drop(n) |
跳过前 n 个元素 |
views::reverse |
反转容器 |
views::iota(start, end) |
生成区间 [start, end) 的整数流 |
views::split(delim) |
拆分字符串 |
views::zip(C++23) |
多容器并行遍历 |
🧪 示例
#include <ranges>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = {1, 2, 3, 4, 5, 6};
auto result = v | std::views::filter([](int n) { return n % 2 == 0; })
| std::views::transform([](int n) { return n * 10; });
for (int x : result)
std::cout << x << " "; // 输出 20 40 60
}
📌 四、组合方式与懒惰求值
views 只在遍历(如 for)时执行实际计算,具备:
- 延迟求值(更高效)
- 不复制容器
- 可链式组合
📎 五、可与 ranges 组合的容器类型
| 容器 | 是否支持 |
|---|---|
std::vector |
✅ |
std::array |
✅ |
std::list |
✅(部分视图不支持) |
std::map / std::set |
✅(但注意访问 key/value) |
自定义容器 |
✅ 只要符合 ranges::range 概念 |
✅ 六、常用组合模板
// 拿出前 5 个平方数
auto squares = views::iota(1, 100)
| views::transform([](int x){ return x * x; })
| views::take(5);
// 过滤并排序 vector
auto evens = v | views::filter([](int x){ return x % 2 == 0; });
std::vector<int> evens_vec(evens.begin(), evens.end());
ranges::sort(evens_vec);
🎯 总结一句话:
C++20 ranges 提供了一个现代、高效、可组合的容器处理方式,
ranges::sort负责 算法执行,而views::xxx负责 懒惰生成数据流,二者可无缝配合形成流水线式编程风格。

浙公网安备 33010602011771号