std :: transform的最后一个参数

时间:2017-02-10 07:01:22

标签: c++ c++11 functor

根据cplusplus.comstd::transform 将操作按顺序应用于一(1)或两(2)个范围的元素,并将结果存储在从结果开始的范围内。 / em> std::transform的最后一个参数通常是一个函数,它对第一个容器的元素进行一些操作,但假设我有一个仿函数对象,如下所示:

struct functor {
  functor(int x) : x(x) {}
  int operator()(int x1) {return x + x1;}

  private :
    int x;
}

然后,代替函数,我也可以传递仿函数的实例,如下所示:

vector<int> v1, v2;
v1.push_back(1);
v1.push_back(2);
v2.resize(v1.size());
std::transform(v1.begin(), v1.end(), v2.begin(), functor(1));

我的问题是,编译器如何知道函数或函数类的实例是否传递给std::transform函数?另外,如果传递了一个实例,那么内部会发生什么,将函数应用于第一个容器的元素?

1 个答案:

答案 0 :(得分:3)

std::transform是一个模板(嗯,一个或两个输入范围有两个重载)函数,可以实现一个范围:

template<class InputIt, class OutputIt, class UnaryOperation>
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first, 
                   UnaryOperation unary_op)
{
    while (first1 != last1) {
        *d_first++ = unary_op(*first1++);
    }
    return d_first;
}

和两个范围

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;
}

对最后一个参数的要求是它有operator ()适用于通过解除引用提供的迭代器获得的类型(即它的参数和返回类型可以隐式转换为它们)。因此它可以是普通函数,lambda或具有此类运算符的任何用户类型。