gpt4 book ai didi

c++ - std::transform 的最后一个参数

转载 作者:行者123 更新时间:2023-11-27 22:46:33 24 4
gpt4 key购买 nike

根据 cplusplus.com , std::transform 按顺序对一 (1) 或两 (2) 个范围的元素应用操作,并将结果存储在从 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 函数的是函数还是仿函数类的实例?此外,如果传递了一个实例,内部会发生什么,关于将函数应用于第一个容器的元素?

最佳答案

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 或具有此类运算符的任何用户类型。

关于c++ - std::transform 的最后一个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42153335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com