问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C++20新特性:范围(Ranges)详解

创作时间:
作者:
@小白创作中心

C++20新特性:范围(Ranges)详解

引用
CSDN
1.
https://blog.csdn.net/xie__jin__cheng/article/details/144663951

C++20 引入了一系列称为“范围(Ranges)”的新特性,这些特性为处理容器和范围提供了更简洁、更高效的方法。范围库主要包括视图(views)、操作(actions)和算法(algorithms)三个部分,旨在提高代码的可读性和性能。

视图(Views)

视图是轻量级的、不可变的范围适配器,它们可以对现有范围进行转换或过滤,生成新的范围。以下是一些常用的视图:

  • std::ranges::views::all:返回一个表示整个范围的视图。

  • std::ranges::views::filter:根据谓词对范围进行过滤。

    auto even_numbers = std::ranges::views::filter(numbers, [](int n) { return n % 2 == 0; });
    
  • std::ranges::views::transform:对范围中的每个元素应用一个函数,并生成一个新的范围。

    auto squares = std::ranges::views::transform(numbers, [](int n) { return n * n; });
    
  • std::ranges::views::slice:截取范围中的一部分。

    auto slice_of_numbers = std::ranges::views::slice(numbers, 1, 5);
    

操作(Actions)

操作是对范围执行某些操作的对象,例如将范围转换为容器,或者对范围中的元素进行排序。

  • std::ranges::to_vector:将范围转换为std::vector

    std::vector<int> vec = std::ranges::to_vector(numbers);
    
  • std::ranges::sort:对范围进行排序。

    std::ranges::sort(numbers);
    

算法(Algorithms)

C++20 范围库中的算法是对标准算法库(<algorithm>)的扩展,旨在与范围更好地协作。

  • std::ranges::find:在范围中查找元素。

    auto it = std::ranges::find(numbers, 42);
    
  • std::ranges::for_each:对范围中的每个元素应用一个函数。

    std::ranges::for_each(numbers, [](int n) { std::cout << n << " "; });
    
  • std::ranges::count:计算范围内等于某值的元素数量。

    auto count = std::ranges::count(numbers, 42);
    

示例代码

以下是一个使用范围库的简单示例:

#include <iostream>
#include <vector>
#include <ranges>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    // 使用 views::filter 过滤出偶数
    auto even_numbers = std::ranges::views::filter(numbers, [](int n) { return n % 2 == 0; });
    // 使用 views::transform 将每个偶数平方
    auto squares = std::ranges::views::transform(even_numbers, [](int n) { return n * n; });
    // 将结果转换为 vector 并输出
    std::vector<int> result = std::ranges::to_vector(squares);
    for (int n : result) {
        std::cout << n << " ";
    }
    return 0;
}

总结

C++20 的范围库提供了一种更现代化、更简洁的方式来处理范围操作,极大地提高了代码的可读性和维护性。通过视图、操作和算法的组合,可以轻松地实现复杂的范围处理逻辑。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号