std::transform 的最后一个参数
Last argument of std::transform
根据cplusplus.com,std::transform
按顺序对一 (1) 个或两 (2) 个范围的元素应用操作,并将结果存储在开始的范围中at result. 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
函数的是函数还是仿函数 class 的实例?此外,如果传递了一个实例,内部会发生什么,关于将函数应用于第一个容器的元素?
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 ()
适用于通过取消引用提供的迭代器获得的类型(即它的参数和 return 类型可以隐式转换为它们)。因此它可以是普通函数、lambda 或具有此类运算符的任何用户类型。
根据cplusplus.com,std::transform
按顺序对一 (1) 个或两 (2) 个范围的元素应用操作,并将结果存储在开始的范围中at result. 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
函数的是函数还是仿函数 class 的实例?此外,如果传递了一个实例,内部会发生什么,关于将函数应用于第一个容器的元素?
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 ()
适用于通过取消引用提供的迭代器获得的类型(即它的参数和 return 类型可以隐式转换为它们)。因此它可以是普通函数、lambda 或具有此类运算符的任何用户类型。