C++23 新特性:views::adjacent 与 views::adjacent_transform

举报
码事漫谈 发表于 2025/05/07 20:20:48 2025/05/07
【摘要】 引言 views::adjacent views::adjacent_transform 两者的区别与联系 总结 引言C++23 对 ranges 库进行了进一步的扩展和完善,其中 views::adjacent 和 views::adjacent_transform 是两个非常实用的新增视图适配器,它们为处理相邻元素提供了更便捷的方式,本文将对这两个新特性进行详细介绍和解析。 views...

引言

C++23 对 ranges 库进行了进一步的扩展和完善,其中 views::adjacentviews::adjacent_transform 是两个非常实用的新增视图适配器,它们为处理相邻元素提供了更便捷的方式,本文将对这两个新特性进行详细介绍和解析。

views::adjacent

  • 定义与功能views::adjacent 是一个范围适配器,它接收一个视图并生成一个新视图。新视图中的每个元素都是一个元组,包含原视图中相邻的 N 个元素的引用。例如,对于一个包含多个元素的向量,使用 views::adjacent<3> 后,生成的视图中的每个元素都是一个包含 3 个相邻元素的元组。

  • 模板参数 :其模板参数 N 表示相邻元素的数量,需大于 0。例如,views::adjacent<2> 表示将相邻的 2 个元素组成一个元组。

  • 作用 :适用于需要对相邻元素进行分组处理的场景,如数据的滑动窗口分析、相邻元素之间的比较或运算等。比如在处理时间序列数据时,可以使用 views::adjacent 来获取每个时间点及其前几个时间点的数据进行分析。

  • 示例代码

    #include <array>
    #include <iostream>
    #include <ranges>
    #include <tuple>
    
    int main() {
        constexpr std::array v{1, 2, 3, 4, 5, 6};
        std::cout << "v = [1 2 3 4 5 6]\n";
    
        for (int i{}; const auto& t : v | std::views::adjacent<3>) {
            auto [t0, t1, t2] = t;
            std::cout << "e = " << t0 << " " << t1 << " " << t2 << "\n";
        }
    }
    

    输出结果为:

    v = [1 2 3 4 5 6]
    e = 1 2 3
    e = 2 3 4
    e = 3 4 5
    e = 4 5 6
    

views::adjacent_transform

  • 定义与功能views::adjacent_transform 同样是一个范围适配器,它在 views::adjacent 的基础上增加了对相邻元素进行转换的功能。它接收一个视图和一个可调用对象,生成的新视图中的每个元素都是将可调用对象应用到原视图中相邻的 N 个元素上所得到的结果。

  • 模板参数与可调用对象 :模板参数 N 表示相邻元素的数量,可调用对象 fun 用于对相邻元素进行转换运算。例如,views::adjacent_transform<2>(std::multiplies()) 表示将相邻的 2 个元素相乘,并将结果作为新视图的元素。

  • 作用 :当需要对相邻元素进行某种特定的运算或转换操作时非常有用,可以简化代码并提高可读性。比如计算相邻元素的和、差、积、商等,或者对相邻元素进行某种逻辑运算或函数变换。

  • 示例代码

    #include <iostream>
    #include <vector>
    #include <ranges>
    
    int main() {
        std::vector v = {1, 2, 3, 4};
        for (auto i : v | std::views::adjacent_transform<2>(std::multiplies())) {
            std::cout << i << ' ';
        }
        // 输出:2 6 12
    }
    

两者的区别与联系

  • 联系 :两者都属于 C++23 中新增的 ranges 库的视图适配器,都用于处理相邻元素,且都基于模板参数 N 来确定相邻元素的数量。在功能上,views::adjacent_transform 可以看作是 views::adjacent 的扩展和增强版本,继承了 views::adjacent 的相邻元素分组思想,并在此基础上增加了转换功能。
  • 区别views::adjacent 主要用于将相邻元素分组为元组,方便对相邻元素进行整体处理;而 views::adjacent_transform 则侧重于对相邻元素进行转换操作,直接得到转换后的结果。在使用场景上,当仅需要获取相邻元素组成的元组时,使用 views::adjacent;当需要对相邻元素进行某种运算或转换并获取结果时,使用 views::adjacent_transform

总结

views::adjacentviews::adjacent_transform 作为 C++23 的新特性,为处理相邻元素提供了更强大、便捷的工具。它们在数据处理、算法实现等领域都有着广泛的应用前景,可以帮助开发者编写出更简洁、高效、易读的代码。随着 C++23 的不断普及和应用,这些新特性将逐渐得到更多的关注和使用。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。