std :: transform和std :: plus如何一起工作?

时间:2016-02-23 03:57:03

标签: c++ c++11 c++14

我正在阅读C ++参考资料,并通过示例遇到了std :: plus函数。这很简单,只需添加lhs和rhs。代码是:

#include <functional>
#include <iostream>

int main()
{
   std::string a = "Hello ";
   const char* b = "world";
   std::cout << std::plus<>{}(a, b) << '\n';
}

输出:Hello world

我把它改成了

#include <functional>
#include <iostream>

int main()
{
   int a = 5;
   int b = 1;
   std::cout << std::plus<int>{}(a, b) << '\n';
}

输出:6

现在我做了

foo vector = 10 20 30 40 50
bar vector = 11 21 31 41 51

我致电:

std::transform (foo.begin(), foo.end(), bar.begin(), foo.begin(), std::plus<int>());

并且它给出了21 41 61 81 101,据我所知它将foo和bar加起来。但它是如何传递给std :: plus函数的?

2 个答案:

答案 0 :(得分:8)

std::plus<>是一个functor,对于实现operator()的类来说,这只是一种奇特的讨论。这是一个例子:

class plus {
  public:
    template <typename A, typename B>
    auto operator()(const A& a, const B& b) const { return a + b; }
};

你所拥有的std::transform大致相当于:

template<class InputIt1, class InputIt2, 
         class OutputIt, class BinaryOperation>
OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, 
                   OutputIt d_first, BinaryOperation binary_op)
{
    while (first1 != last1) {
        *d_first++ = binary_op(*first1++, *first2++);
    }
    return d_first;
}

此处,binary_opstd::plus<>的名称。由于std::plus<>是一个仿函数,C ++会将对它的“调用”解释为对operator()函数的调用,从而为我们提供所需的行为。

答案 1 :(得分:0)

std::plus STL提供的一组仿函数之一。如果您熟悉函数式编程,它们是函数组合的便利。 std :: plus具体是二元运算符,因此需要两个参数。 std :: Transform将从两个向量中发送元素。您还可以使用std :: bind将二元运算符转换为一个参数运算符,基本上将常量绑定到第二个参数。

我个人认为std :: plus及其类似功能在c ++ 11 lambda函数出现之前更有用。 Lambda允许您定义一组操作来对您的数据执行,而无需处理绑定或std :: plus及其同类。