0Pricing
C++ Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 迭代器类别:输入、前向、双向、随机访问
  2. 常见迭代器模式:begin、end、advance
  3. C++20 范围库入门
  4. 范围适配器:views::filter、views::transform、views::take
← 返回 C++ Academy