STL std :: transform

时间:2017-11-18 13:06:23

标签: c++ stl

transform()算法有两种形式,我对第一种形式没问题。

以下是第二个模板规范:

template <class InputIterator1, class InputIterator2,
          class OutputIterator, class BinaryOperation>
  OutputIterator transform (InputIterator1 first1, InputIterator1 last1,
                            InputIterator2 first2, OutputIterator result,
                            BinaryOperation binary_op);

我的书说,

  

在第二种形式中,使用二进制应用转换   从中接收元素值的operator函数   要转换的序列,如第一个参数和元素   从第二个序列作为其第二个参数。

Q1。为什么第二个序列没有输入迭代器参数表示第二个序列的结束?即为什么InputIterator last2中没有transform()参数?

Q2。当第一个和第二个序列的长度不相等时会发生什么?

Q3。块引用文本说明二元运算符函数。那么这个运算符函数在这种情况下意味着什么呢?不是任何二元函数都有效吗?

2 个答案:

答案 0 :(得分:4)

  

Q1。为什么第二个序列没有输入迭代器参数   表明第二个序列的结束?

因为第二个序列必须至少与第一个序列一样长。该算法知道在达到第一个序列的结束时完成了它的工作。

  

Q2。当第一个和第二个序列的长度不相等时会发生什么?

如果第二个序列比第一个序列短,则会得到未定义的行为。否则,如果第二个更长,没有任何不好的事情发生;其余的元素将被忽略。

  

Q3。块引用文本表示二元运算符函数。那么这个运算符函数在这种情况下意味着什么呢?

它的第一个参数是来自第一个序列的元素 N ,它的第二个参数是来自第二个序列的元素 N 。它可以是任何可以像这样调用的东西,例如普通函数,类似函数的对象,如std::function,lambda,通过std::bind绑定的东西等等。唯一重要的是可以使用()语法调用它。

我建议对“功能对象”和“仿函数”进行一些互联网研究。

答案 1 :(得分:1)

此版本的转换将两个序列转换为一个序列。比如,如果操作是op,那么这对序列

[a, b, c, d]

[e, f, g, h]

转化为

[op(a, e), op(b, f), op(c, g), op(d, h)]

可能的简单实现是

for (; first1 != last1; ++first1, ++first2)
{
    *result++ = binary_op(*first1, *first2);
}

现在,问题。

  1. 显然,两个序列的长度必须一致才能使算法工作。因此,如果它知道第一个序列的长度,它会自动知道第二个序列的长度,因此它知道在迭代时停止的位置。看起来大致如下:

  2. 如果第二个序列的长度较大,则算法不会使用其余序列。如果第一个序列的长度较小,则它是未定义的行为。

  3. 是的,它可以是任何callable with appropriate arguments using the function call operator:函数指针,函数对象,lambda等。