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

引言
C++23 对 ranges 库进行了进一步的扩展和完善,其中 views::adjacent 和 views::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::adjacent 和 views::adjacent_transform 作为 C++23 的新特性,为处理相邻元素提供了更强大、便捷的工具。它们在数据处理、算法实现等领域都有着广泛的应用前景,可以帮助开发者编写出更简洁、高效、易读的代码。随着 C++23 的不断普及和应用,这些新特性将逐渐得到更多的关注和使用。
- 点赞
- 收藏
- 关注作者
评论(0)