2017-11-18 96 views
2

transform()算法有两种形式,我很好,第一种。STL std :: transform

这里是第二个模板规格:

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

我的书上说,

在第二种形式,改造使用将所值的二分 操作功能应用来自 序列的元素要在其第一参数中进行变换,并且将来自第二序列的元素 作为其第二参数。

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

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

q3。块引用文字说二元运算符函数。那么这个操作符函数在这种情况下意味着什么?没有任何二进制函数有效吗?

回答

4

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

由于第二序列必须至少只要反正第一个。该算法知道在达到第一个序列的结束时其工作已完成。

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

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

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

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

我推荐一些关于“函数对象”和“函子”的Internet研究。

+0

我能够推断出该第一个参数是N元素从所述第一序列,其第二个参数是第二个序列中的元素N.但为什么会有“操作员功能”这个术语?说什么“操作员功能” – rimiro

+0

@PeteBecker:好点!固定。 –

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:一个函数指针,一个功能对象,一个拉姆达等

+0

你完美地解释了前两个问题,但我仍然不清楚第三个问题。为什么使用术语“操作员功能”?他们不是他们吗?我在这里错过了什么?谢谢! – rimiro

+1

@rimiro我认为这只是一个不幸的词汇。这通常称为函数对象,并且是使用函数调用操作符“op(x,y)'实际上可以调用的任何东西。请参阅http://en.cppreference.com/w/cpp/concept/FunctionObject – lisyarus

相关问题