C++ std::ranges::fold_left_first_with_iter 和 std::ranges::fold_left_first_with_iter_result

2025年3月24日 | 7分钟阅读

在本文中,我们将讨论 C++ 中的 **std::ranges::fold_left_first_with_iter** 和 **std::ranges::fold_left_first_with_iter_result**,介绍它们的特性和示例。

Std::ranges::fold_left_first_with_iter

使用 C++ 函数 **std::ranges::fold_left_first_with_iter**,从第一个元素开始,对范围执行左折叠(或归约)操作。它使用一些预先指定的 二元操作 顺序地从左到右组合元素。与标准的折叠操作不同,此函数返回指向最后一个已处理元素的迭代器以及聚合结果。累加的结果和执行折叠操作的范围都可以得到,这使其对复杂算法更加灵活。

  • 目的:如果我们的目标是向集合中的元素添加或从中减去元素,则会调用函数 std::ranges::fold_left_first_with_iter,顾名思义,它从左侧操作,并将序列的第一个值作为初始值。它是 std::accumulate 函数的更复杂、更灵活的变体,std::accumulate 也被称为左折叠。
  • 迭代器操作:与标准的折叠操作不同,此技术还将折叠的迭代器和结果传递给最后一个已处理的元素。如果需要在使用或之后跟踪范围内的位置,这可能很有用。

特性

  • 范围内的第一个元素是起始值。
  • 它按顺序从左到右处理每个部分。
  • 它还将迭代器发送到最后一个已处理的元素,以便在需要用户了解折叠在范围内的停止位置的算法中使用。
  • 用户提供一个二元操作(函数或 lambda)来指示组件如何组合。

示例

让我们举一个例子来说明 C++ 中的 std::ranges::fold_left_first_with_iter 函数。

输出

 
Sum of numbers: 150
Last processed element: 50   

解释

自定义 Fold_left_first_with_iter

  • 此特定函数使用多个元素进行软折叠(左归约)。
  • 它从给定范围的第一个成员开始,然后将运算符应用于其他成员。
  • 在利用迭代器后,它返回一个 std::pair,其中包含折叠结果和指向最后一个“已处理”元素的迭代器。
  • 使用加法二元操作,将范围内的项相加。

管理迭代器

  • 使用遍历迭代器(iter)手动解析范围。
  • 迭代器(last_iter)指向处理结束的位置,设置为指向最后一个已处理元素的位置(在本例中为 numbers.end())。
  • 错误处理:如果输入范围为空,则会引发异常,以确保函数仅在有效范围内运行。

关键点

此自定义 fold_left_first_with_iter 方法使用标准的 C++20 功能实现了此期望的行为。

手动左折叠与迭代器允许在折叠 C++ 集合范围时进行迭代:当它折叠时,它在折叠完成后返回迭代器和结果。

std::ranges::fold_left_first_with_iter_result

C++ 的 **std::ranges::fold_left_first_with_iter_result** 标准输出体现了 ranges::fold_left_first_with_iter 操作。其值的两个组成部分是折叠或归约的结果,iter 是指向折叠过程中最后一个已处理元素的迭代器。通过提供左折叠结果和操作停止的范围位置,为基于范围的算法提供了更多上下文和控制。通过此,用户还可以跟踪折叠到达的距离,这在进一步处理取决于范围内的确切位置时可能很有帮助。

目的

此类型由 fold_left_first_with_iter 方法生成。它包含折叠操作的结果和指向最后一个已处理元素的迭代器。

特性

它由两部分组成:

  • Value:折叠操作产生的总值。
  • Iter:指示最后一个折叠到结果中的元素的迭代器。
  • 此结果结构在需要折叠结果和范围位置的复杂算法中可能很有用,因为它同时产生累加值和范围内的位置。

用例

这些折叠技术在以下情况特别有益:

  • 必须在范围内执行累加,但我们不想指定初始值。
  • 必须跟踪累加期间处理的范围内的最后一个元素,以便能够基于该位置进行进一步操作。

示例

让我们举一个例子来说明 C++ 中的 std::ranges::fold_left_first_with_iter_result。

输出

 
Product of numbers: 12000000
Last processed element: 50   

说明

此自定义结构类似于虚构的,使用了 std::fold_left_first 和 iter_result 函数,它们可以这样实现。在一个范围中,使用迭代器结果进行左折叠。那里维护着两类信息:

  • Value:折叠的结果(在此例中为数字的乘积)。
  • Iter:一种返回到范围内最后一个已处理元素的方法。
  • 自定义 fold_left_first_with_iter 函数:此函数使用第一个元素作为初始值来折叠范围。它为每个后续元素分配一个二元操作(在此示例中为乘法)。
  • 返回的 fold_left_first_with_iter_result 结构包含结果和指向范围末尾的迭代器。
  • 示例二元操作:在此示例中,范围内的每个整数(10 * 20 * 30 * 40 * 50)被集体相乘。
  • 迭代器处理:与返回迭代器的标准折叠操作类似,iter 在折叠后指向最后一个已处理元素之后的下一个位置。

关键点

  • 自定义折叠结果类型:为了模拟您要求的行为,fold_left_first_with_iter_result 类型存储最后一个已处理元素的迭代器以及累加结果。
  • 灵活的折叠:此方法可适应多种二元操作,例如求和、乘积等。
  • 代码中使用了标准的 C++20 std::ranges 和基本的迭代器操作,这些代码是用 C++20 功能创建的。

结论

总之,C++20 中的标准功能可以模仿 **std::ranges::fold_left_first_with_iter** 和 **std::ranges::fold_left_first_with_iter** 的预期行为,因为它们(目前,直到 C++23 之前)不是 C++ 标准库的一部分。可以创建类型以及一个函数,以便我们可以对范围进行左折叠(或归约),同时跟踪总结果和最后一个已处理元素的迭代器。这种方法足够通用,可用于各种基于范围的算法,这些算法不仅需要折叠信息,还需要范围的进度信息。这组技术允许程序员在不依赖非标准扩展的情况下使用迭代器执行强大的折叠操作,从而生成符合标准库、可移植的代码。