首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STL std::transform

STL std::transform
EN

Stack Overflow用户
提问于 2017-11-18 13:06:23
回答 2查看 174关注 0票数 2

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

下面是第二个模板规范:

代码语言:javascript
复制
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。块引号为二进制运算符函数。那么,在这种情况下,运算符函数意味着什么呢?任何二进制函数都无效吗?

EN

回答 2

Stack Overflow用户

发布于 2017-11-18 13:16:48

q1。为什么没有第二个序列的输入迭代器参数来指示第二个序列的结尾?

因为第二个序列至少要和第一个序列一样长。该算法知道其工作是在到达第一个序列的结束时完成的。

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

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

q3。块引号文本表示二进制运算符函数。那么,在这种情况下,运算符函数意味着什么呢?

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

我推荐一些关于“功能对象”和“函子”的互联网研究。

票数 4
EN

Stack Overflow用户

发布于 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)]

一个可能的简单实现是

代码语言:javascript
复制
for (; first1 != last1; ++first1, ++first2)
{
    *result++ = binary_op(*first1, *first2);
}

现在回答你的问题。

  1. 显然,这两个序列的长度必须重合,才能使算法工作。因此,如果它知道第一个序列的长度,它就会自动知道第二个序列的长度,因此它知道迭代时在哪里停止。看起来大概是这样的:
  2. 如果第二序列的长度较大,则算法不使用其余的序列。如果第一个序列的长度较小,则为未定义的行为。
  3. 是的,它可以是任何使用函数调用运算符使用适当的参数可调用:函数指针、函数对象、lambda等等。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47366436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档