2017-02-10 46 views
0

根据cplusplus.com,std::transform对一个(1)或两个(2)范围的元素顺序应用操作,并将结果存储在从结果开始的范围中。std::transform最后一个参数通常是一个函数,该函数在第一容器中的元素一些操作,但假设我有一个算符对象如下: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

您可能想看看[cppreference](http://en.cppreference.com/w/cpp/algorithm/transform)上介绍的示例实现,它是一个函数模板,它可以推导函子的类型。在语义分析阶段,编译器知道AST节点的类型,并将函数调用语法节点演化为适当的节点/动作(调用函数或调用函数调用操作符) –

回答

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或任何用这种操作符的用户类型。

相关问题