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。块引用文本说明二元运算符函数。那么这个运算符函数在这种情况下意味着什么呢?不是任何二元函数都有效吗?
答案 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);
}
现在,问题。
显然,两个序列的长度必须一致才能使算法工作。因此,如果它知道第一个序列的长度,它会自动知道第二个序列的长度,因此它知道在迭代时停止的位置。看起来大致如下:
如果第二个序列的长度较大,则算法不会使用其余序列。如果第一个序列的长度较小,则它是未定义的行为。
是的,它可以是任何callable with appropriate arguments using the function call operator:函数指针,函数对象,lambda等。