SGI

transform

类别:算法 组件类型:函数

原型

Transform是重载的名称;实际上有两个transform函数。
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对对象执行运算;有两个版本transform,其中一个使用 InputIterator 的单个范围,另一个使用 InputIterator 的两个范围。

的第一个版本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可用于修改序列“就地”:允许迭代器firstresult相同。 [1]

定义

在标准头文件中 algorithm 中定义,以及非标准向后兼容性头文件中 algo.h 中定义。

类型要求

对于第一个(一元)版本对于第二个(二元)版本

前提条件

对于第一个(一元)版本对于第二个(二元)版本

复杂度

线性。此运算恰好应用于last - first在单目版本中或者last1 - first1在二目版本中。

示例

使用负数替换数组中的每个数字。
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)无效。

另请参见

函数对象概述copy, generate, fill
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息