根据cplusplus.com,std::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
函数?另外,如果传递了一个实例,那么内部会发生什么,将函数应用于第一个容器的元素?
答案 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或具有此类运算符的任何用户类型。