📅  最后修改于: 2023-12-03 15:14:03.191000             🧑  作者: Mango
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}
。