C++20 范围库入门
使用接收范围而非迭代器对的 std::ranges 算法
C++20 范围库入门 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
为什么需要范围
传统 STL 接受一对迭代器(v.begin(), v.end())。C++20 范围只接受一个范围值,并增加了可组合性。
引入范围
包含 <ranges>。用于算法的命名空间是 std::ranges,用于延迟视图的命名空间是 std::views。
#include <ranges>
#include <algorithm>范围算法
每个标准算法都有对应的范围版本,接受一个范围,而不是两个迭代器。
std::vector<int> v = {3, 1, 4, 1, 5};
std::ranges::sort(v); // sort the whole range
auto it = std::ranges::find(v, 4);投影函数
范围算法接受可选的投影——在比较前应用于每个元素的函数。这样可以避免编写自定义比较器。
struct Person { std::string name; int age; };
std::vector<Person> people;
std::ranges::sort(people, {}, &Person::age);
// sort by age, default comparison什么是范围
任何支持 begin() 和 end() 的对象都可以称为范围。容器、数组,以及在 C++20 中公开哨兵的任何自定义类型都属于范围。
哨兵
C++20 将 end() 泛化为哨兵——它不必与迭代器属于同一类型。这对输入流和无限范围很有用。
视图:延迟范围管道
视图是一种不拥有元素的范围,按需生成元素。使用管道运算符 | 将多个视图组合起来。
auto squares = v
| std::views::filter([](int x) { return x % 2 == 0; })
| std::views::transform([](int x) { return x * x; });
for (int x : squares) std::cout << x << " ";延迟求值
视图在被迭代之前不会分配内存或运行。filter | transform | take(5) 只会生成前 5 个经过变换的值,不会生成更多。
借用范围与生命周期
视图会借用其源范围。如果源范围被销毁,视图就会悬空。请谨慎处理基于临时对象创建的视图,不过 C++20 已增加相应的保护机制。
立即求值与延迟求值
算法会立即生成结果(现在就计算)。视图是延迟的(在迭代时计算)。请根据是否需要将结果具体化来选择。
性能
延迟管道可以避免创建中间容器。编译器通常会将管道优化得如同单个循环。请使用编译器浏览器进行检查和验证。
迁移路径
如果无法使用 C++20,Eric Niebler 的 range-v3 等库可以在 C++14/17 中提供相同的模型。现在学习它有助于日后轻松迁移。
快速检查
与迭代器对形式的 STL 相比,C++20 范围的主要优势是什么?
总结
C++20 范围改进了 STL 算法——传入单个范围、使用投影,并通过视图构建延迟管道。管道运算符可以将过滤、变换和取值操作组合成清晰的声明式代码。
常见问题解答
「C++20 范围库入门」课时是免费的吗?
是的 — 「C++20 范围库入门」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「C++20 范围库入门」这节课中我会学到什么?
使用接收范围而非迭代器对的 std::ranges 算法 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「C++20 范围库入门」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 迭代器类别:输入、前向、双向、随机访问
- 常见迭代器模式:begin、end、advance
- C++20 范围库入门
- 范围适配器:views::filter、views::transform、views::take