C++ std::views::drop2025年3月24日 | 阅读12分钟 C++ 范围和视图简介C++20 新增了范围(ranges)和视图(views)的概念,以改变开发人员处理容器的方式。范围是另一个定义元素序列的概念;算法可以作用于这些序列,而无需遍历它们。范围在处理 STL 算法时提高了代码的可读性和简洁性,且不会产生明显的干扰。 视图是一种范围,它为另一个范围提供一个非拥有(non-owning)、按需(on-demand)的视图。视图使得可以在不复制或修改集合的情况下,在函数中使用集合中的数据。由于视图是惰性的,诸如过滤、转换或跳过元素等操作仅在访问数据时执行。 范围和视图并不相同,但它们是互补的,因为两者的使用可以通过链式操作来简化许多操作。例如,可以使用单个表达式来过滤、映射和丢弃范围中的元素。这种新方法提高了C++ 代码的运行时间、可读性和模块化,并使该语言更接近函数式编程范例。 视图为何有助于高效数据处理?
std::views::drop 的解释及其目的std::view 是 C++20 标准库范围(ranges)的一部分,是一种视图适配器。它用于创建一个范围的视图,该视图跳过("drop")底层范围的前 N 个元素,从而可以从第 (N + 1) 个位置开始访问元素。这使得不必接触原始容器即可有效地跳过一定数量的元素。 目的std::views::drop 的主要目的是提供一种简单快速的方法来处理数据的子集。而不是手动遍历集合并跳过元素,std::views drop 操作 < |db|>:views::drop 如此清晰、富有表现力且惰性地执行此操作。 它还可以与其他视图(如 std:::filter 和 std::views::transform)无缝协作,从而以简洁易读的方式对范围应用多个转换。由于其惰性和非拥有性,它有助于提高性能和内存使用。 它在 C++20 范围的上下文中如何工作?在 C++20 中,**std::views::drop** 是一个在范围库中操作的操作,用于创建现有范围的惰性且非拥有的视图,其中前 N 个元素被过滤掉。这不会以任何方式扭曲原始数据,从而实现高效处理。工作原理如下:
std::views::drop 的基本用法语法C++20 特性 std::<views::drop> 是一种视图适配器,它将一个范围作为输入并返回从第 N 个元素开始的范围视图。它在不影响原始范围的情况下,方便有效地选择较少数量的元素。 在这里,original_range 是我们要操作的容器或范围,N 是要跳过的元素数量。运算符 | 用于将范围通过管道传递给视图适配器 std::views::drop(N)。 使用示例1. 从 vector 中丢弃前 N 个元素输出 4 5 6 7 8 9 10 在此示例中,std::views::drop(3) 会丢弃数字 vector 的前 3 个元素,并从第 4 个元素开始输出。 2. 从数组中丢弃元素输出 30 40 50 60 在此,将跳过 {10, 20} 数组的前两个元素,并显示其余元素。 3. 将 std::views::drop 与其他视图适配器一起使用输出 10 12 14 16 18 20 在这种情况下,在丢弃前 4 个元素后,使用 std::views::transform 将剩余的每个元素都乘以 2。 将 std::views::drop 与 std::views::take 以及 std::views::filter 等其他视图适配器进行比较
关键区别
所有三个视图都是惰性的(操作在范围被迭代时执行)且非拥有的(它们不复制数据)。这些特性使它们适用于处理大量范围数据和低效数据操作。 std::views::drop 如何与迭代器和范围交互?C++20 中的 std::views::drop 以非常灵活的方式与迭代器和范围一起工作,并支持 COT(连续存储)和非 COT。了解它与其他容器类型(如链表和集合)的交互方式对于充分发挥其能力至关重要。 1. 迭代器
2. 惰性求值
与非连续容器的交互1. 链表
输出 3 4 5 在此示例中,丢弃了前两个元素,视图从第三个元素开始。 2. 集合(Sets)
示例 输出 3 4 5 这里,跳过了前两个元素(1 和 2),视图从有序集合的第三个元素开始。 关键注意事项
总而言之,std::views::drop 使跳过范围中的元素变得容易,并能与连续和非连续容器一起工作。它是一个方便的现代 C++ 编程工具,因为它是一种惰性求值的非拥有迭代器,并可用于不同类型的容器。 实施让我们举一个例子来说明 C++ 中的 **std::views::drop 函数。 输出 Original numbers: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 After dropping first 10 elements: 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 After filtering out even numbers: 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 After squaring the remaining numbers: 121 169 225 289 361 441 529 625 729 841 961 1089 1225 1369 1521 1681 1849 2025 2209 2401 2601 2809 3025 3249 3481 3721 3969 4225 4489 4761 5041 5329 5625 5929 6241 6561 6889 7225 7569 7921 8281 8649 9025 9409 9801 Sum of squared values: 166485 std::views::drop 的特性
结论总之,**std::views::drop** 是 C++20 范围库的一部分,它能够无需移动任何数据即可移除序列中的一定数量的项,甚至可以用最少的精力实现。它还具有惰性求值的优势,因为丢弃操作在视图使用时执行,并且可能需要大量计算时间,尤其是在处理大型数据集时。由于视图不拥有数据,该机制对于管理各种持有者(包括连续和非连续结构)中的数据来说,既灵活又快速。 下一主题查找 C++ 中青蛙叫的最小数量 |
我们请求您订阅我们的新闻通讯以获取最新更新。