c++ Ranges Library使用笔记(简单说明)
- 1. 数值适配器(Range Adapters)
- 常用数值适配器
- 示例代码
- 2. 生成器(Generators)
- 常用生成器
- 示例代码
- 3. 组合使用示例
- 示例代码
- 总结
- 数值适配器(Range Adapters)
- 生成器(Generators)
- 组合使用
C++20 引入了 范围库(Ranges Library),其中包括 数值适配器(Range Adapters) 和 生成器(Generators)。这些工具可以简化对区间的操作,并支持链式调用和惰性求值。
以下是数值适配器和生成器的简单说明及示例:
1. 数值适配器(Range Adapters)
数值适配器用于对输入区间进行变换、过滤等操作,返回一个新的视图(View)。视图是惰性的,只有在需要时才会计算。
常用数值适配器
std::views::transform
: 对区间中的每个元素进行变换。std::views::filter
: 过滤区间中满足条件的元素。std::views::take
: 取区间中的前 N 个元素。std::views::drop
: 跳过区间中的前 N 个元素。std::views::reverse
: 反转区间。
示例代码
#include <iostream>
#include <ranges>
#include <vector>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 使用 transform 将每个元素乘以 2auto doubled = numbers | std::views::transform([](int n) { return n * 2; });for (int n : doubled) {std::cout << n << " "; // 输出: 2 4 6 8 10 12 14 16 18 20}std::cout << std::endl;// 使用 filter 过滤偶数auto evens = numbers | std::views::filter([](int n) { return n % 2 == 0; });for (int n : evens) {std::cout << n << " "; // 输出: 2 4 6 8 10}std::cout << std::endl;// 使用 take 取前 5 个元素auto first_five = numbers | std::views::take(5);for (int n : first_five) {std::cout << n << " "; // 输出: 1 2 3 4 5}std::cout << std::endl;// 组合使用:过滤偶数,取前 3 个,然后乘以 2auto combined = numbers | std::views::filter([](int n) { return n % 2 == 0; })| std::views::take(3)| std::views::transform([](int n) { return n * 2; });for (int n : combined) {std::cout << n << " "; // 输出: 4 8 12}std::cout << std::endl;return 0;
}
2. 生成器(Generators)
生成器用于在运行时生成数值序列,可以是有限的或无限的。
常用生成器
std::views::iota
: 生成一个递增的数值序列。
示例代码
#include <iostream>
#include <ranges>int main() {// 生成从 1 开始的无限序列auto infinite_seq = std::views::iota(1);// 取前 10 个元素for (int n : infinite_seq | std::views::take(10)) {std::cout << n << " "; // 输出: 1 2 3 4 5 6 7 8 9 10}std::cout << std::endl;// 生成从 10 到 19 的有限序列auto finite_seq = std::views::iota(10, 20);for (int n : finite_seq) {std::cout << n << " "; // 输出: 10 11 12 13 14 15 16 17 18 19}std::cout << std::endl;return 0;
}
3. 组合使用示例
数值适配器和生成器可以组合使用,实现复杂的逻辑。
示例代码
#include <iostream>
#include <ranges>int main() {// 生成从 1 开始的无限序列auto seq = std::views::iota(1);// 过滤偶数,取前 5 个,然后乘以 3auto result = seq | std::views::filter([](int n) { return n % 2 == 0; })| std::views::take(5)| std::views::transform([](int n) { return n * 3; });for (int n : result) {std::cout << n << " "; // 输出: 6 12 18 24 30}std::cout << std::endl;return 0;
}
总结
数值适配器(Range Adapters)
- 功能:对区间进行变换、过滤、截取等操作。
- 特点:惰性求值,支持链式调用。
- 常用适配器:
transform
:变换元素。filter
:过滤元素。take
:取前 N 个元素。drop
:跳过前 N 个元素。reverse
:反转区间。
生成器(Generators)
- 功能:生成数值序列。
- 特点:可以是无限的或有限的。
- 常用生成器:
iota
:生成递增序列。
组合使用
- 数值适配器和生成器可以组合使用,实现复杂的逻辑。
- 示例:
auto result = std::views::iota(1)| std::views::filter([](int n) { return n % 2 == 0; })| std::views::take(5)| std::views::transform([](int n) { return n * 3; });
通过使用数值适配器和生成器,可以编写更简洁、高效的代码,同时充分利用 C++20 的范围库特性。