transform()算法有两种形式,我对第一种很好。
下面是第二个模板规范:
template <class InputIterator1, class InputIterator2,
class OutputIterator, class BinaryOperation>
OutputIterator transform (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, OutputIterator result,
BinaryOperation binary_op);我的书上说,
在第二形式中,使用二进制运算符函数应用该转换,该二进制运算符函数从要转换的序列中接收元素的值,如其第一参数,从第二序列接收元素的值作为其第二参数。
q1。为什么没有第二个序列的输入迭代器参数来指示第二个序列的结尾?例如,为什么在InputIterator last2中没有transform()参数
q2。当第一和第二序列的长度不相等时会发生什么?
q3。块引号为二进制运算符函数。那么,在这种情况下,运算符函数意味着什么呢?任何二进制函数都无效吗?
发布于 2017-11-18 13:16:48
q1。为什么没有第二个序列的输入迭代器参数来指示第二个序列的结尾?
因为第二个序列至少要和第一个序列一样长。该算法知道其工作是在到达第一个序列的结束时完成的。
q2。当第一和第二序列的长度不相等时会发生什么?
如果第二个序列比第一个序列短,则会得到未定义的行为。否则,如果第二个元素较长,则不会发生任何不好的事情;其余的元素将被忽略。
q3。块引号文本表示二进制运算符函数。那么,在这种情况下,运算符函数意味着什么呢?
它的第一个参数是来自第一个序列的元素N,第二个参数是来自第二个序列的元素N。它可以是任何可以被称为那样的东西,例如一个简单的函数,一个类似于函数的对象,比如std::function,lambda,通过std::bind绑定的东西等等。唯一重要的是可以用()语法调用它。
我推荐一些关于“功能对象”和“函子”的互联网研究。
发布于 2017-11-18 13:20:03
此转换版本将两个序列转换为一个序列。比如说,如果操作如果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);
}现在回答你的问题。
https://stackoverflow.com/questions/47366436
复制相似问题