类别:算法 | 组件类型:函数 |
template <class InputIterator, class OutputIterator, class UnaryFunction> OutputIterator transform(InputIterator first, InputIterator last, OutputIterator result, UnaryFunction op); template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction> OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction binary_op);
的第一个版本transform执行运算op(*i)每个迭代器i在范围内[first, last),并将该运算的结果分配给*o,其中o是相应的输出迭代器。也就是说,对于每个n这样0 <= n < last - first,它执行分配*(result + n) = op(*(first + n))。返回值是result + (last - first).
的第二个版本transform非常类似,但它使用 Binary Function 而不是 Unary Function:它执行运算op(*i1, *i2)每个迭代器i1在范围内[first1, last1)并将结果分配给*o,其中i2是第二个输入范围中的相应迭代器,并且如果o是相应的输出迭代器。也就是说,对于每个n这样0 <= n < last1 - first1,它执行分配*(result + n) = op(*(first1 + n), *(first2 + n))。返回值是result + (last1 - first1).
请注意transform可用于修改序列“就地”:允许迭代器first和result相同。 [1]
const int N = 1000; double A[N]; iota(A, A+N, 1); transform(A, A+N, A, negate<double>());
计算两个向量的和,并将结果存储到第三个向量中。
const int N = 1000; vector<int> V1(N); vector<int> V2(N); vector<int> V3(N); iota(V1.begin(), V1.end(), 1); fill(V2.begin(), V2.end(), 75); assert(V2.size() >= V1.size() && V3.size() >= V1.size()); transform(V1.begin(), V1.end(), V2.begin(), V3.begin(), plus<int>());
[1] 输出迭代器result不允许与该范围内的任何 输入迭代器 相同[first, last),除first自身外。也就是说transform(V.begin(), V.end(), V.begin(), fabs)有效,但transform(V.begin(), V.end(), V.begin() + 1, fabs)无效。