📜  C++中的transform_inclusive_scan()函数(1)

📅  最后修改于: 2023-12-03 15:14:03.191000             🧑  作者: Mango

C++中的transform_inclusive_scan()函数

transform_inclusive_scan() 函数是C++17标准中新增的一个算法函数,它执行一个二元操作,对一个范围内的元素进行增量和,可选地对每个元素进行一个映射操作。

函数声明
template<typename InputIt, typename OutputIt, typename BinaryOp, typename UnaryOp>
OutputIt transform_inclusive_scan(InputIt first, InputIt last, OutputIt d_first,
                                  BinaryOp binary_op, UnaryOp unary_op);

参数列表:

  • first:需要进行操作的第一个元素的迭代器。
  • last:需要进行操作的最后一个元素的迭代器。
  • d_first:输出结果的目标容器的起始迭代器。
  • binary_op:执行增量和操作的二元函数对象。该函数必须接受两个参数,第一个参数是之前两个元素执行增量和操作的结果,第二个参数是接下来要进行操作的元素的值。
  • unary_op:可选的一元函数对象,该函数对每个元素进行映射操作。如果不指定,将跳过对每个元素的映射操作。
函数作用

transform_inclusive_scan() 函数对范围内的每个元素执行映射操作(如果指定了一元函数对象),然后将结果存储在输出迭代器指向的序列中。与 inclusive_scan() 不同的是,transform_inclusive_scan() 允许对映射操作的结果执行增量和操作。

transform_inclusive_scan() 函数的过程中,会保留从第一个元素到当前元素的所有中间结果,将其存储在输出序列中。例如,对于输入范围 {1,2,3} 和指定的 binary_op 函数 x+y,输出序列将是:{1,3,6}

示例
#include <algorithm>
#include <functional>
#include <iostream>
#include <numeric>
#include <vector>

int main() {
  std::vector<int> v = {1, 2, 3, 4};

  std::vector<int> res(v.size());
  std::transform_inclusive_scan(v.begin(), v.end(), res.begin(),
                                std::plus<int>(), [](int x) { return x * x; });

  for (auto n : res) {
    std::cout << n << " ";
  }
  std::cout << std::endl;

  return 0;
}

输出:

1 5 14 30

以上代码对一个输入序列中的每个元素执行了平方操作,然后对平方结果执行增量和操作。最终输出的序列为 {1, 5, 14, 30}