在下面的代码中,考虑转换函数。传递给它的函数对象是Add(10)。这意味着添加a = Add(10)或Add a = 10有效。 根据我的理解,Add(10)用一个参数调用构造函数,_v将初始化为vector的值。因此,在执行+ _v之前,_v的值是向量的内容。添加后,vector的值将增加10。
任何人都可以澄清一下如何调用构造函数以及如何调用函数operator()(int a)?
代码:
struct Add
{
int _v;
Add(int v) : _v(v) {}
int operator()(int a)
{
cout<<a;
return a + _v;
}
};
int main()
{
int t[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
vector<int> v1(t, t + 10);
list<int> l1(v1.size());
//Add a = Add(10);
cout << "Source collection:\n";
cout << "v1: "; for_each(v1.begin(), v1.end(), print<int>); cout << endl << endl;
cout << "Adding value - 10 to all the elements of the collection:\n";
transform(v1.begin(), v1.end(), l1.begin(), Add(10));
cout << "l1: "; for_each(l1.begin(), l1.end(), print<int>); cout << endl << endl;
return 0;
}
输出: 来源收藏: v1:1 2 3 4 5 6 7 8 9 10
为集合的所有元素添加值 - 10:
12345678910 l1:11 12 13 14 15 16 17 18 19 20
答案 0 :(得分:0)
[...] Add(10)使用一个参数调用构造函数, _v将初始化为向量的值。 [...]
都能跟得上! _v
将初始化为构造函数中作为参数传递的值。在您的情况下10
。
因此,您将构造一个对象(结构Add
的实例),并将其变量成员(_v
)初始化为10
。
调用函数对象时(参见operators overloading),然后int
并返回int
加上_v
中存储的值( 10 < / em>在你的情况下)。
标准函数transform以这种方式工作:
transform(v1.begin(), v1.end(), l1.begin(), Add(10));
获取一些输入,将它们应用于函数(转换)并将转换后的对象存储在某个输出中。
在你的情况下:
v1
(// from v1.begin to v2.end
)。l1
中。Add(10)
的实例。因此operator()
调用向量的每个元素(这就是operator()
Add
取整数作为输入参数的原因)并返回一个新的整数x + 10
。 简而言之,向量的每个整数都由operator()
Add
对象转换,该对象给出10和它的总和。