c++ Ranges Library使用笔记(简单说明)

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 
#include 
#include 

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    // 使用 transform 将每个元素乘以 2
    auto 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 个,然后乘以 2
    auto 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 
#include 

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 
#include 

int main() {
    // 生成从 1 开始的无限序列
    auto seq = std::views::iota(1);

    // 过滤偶数,取前 5 个,然后乘以 3
    auto 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 的范围库特性。

你可能感兴趣的:(C++,c++,笔记,算法)