关于std::for_each与结构体配合使用的技术疑问
关于std::for_each与自定义函数对象的疑问解答
先看你学习的这段代码:
std::vector<int> v{3, -4, 2, -8, 15, 267}; struct Sum { void operator()(int n) { sum += n; } int sum {0}; }; // invoke Sum::operator() for each element Sum s = std::for_each(v.cbegin(), v.cend(), Sum()); std::cout << "sum: " << s.sum << '\n';
问题解答
执行std::for_each前,变量s处于什么状态?
执行std::for_each前,变量s还未被初始化——它是在std::for_each执行完毕后,被该函数返回的函数对象拷贝赋值,才完成初始化的。在每次迭代过程中,s会发生哪些变化?
迭代过程中s本身没有任何变化。std::for_each内部操作的是你传入的Sum()临时对象:每次遍历到向量的一个元素,这个临时对象就会调用重载的operator(),把元素值累加到自己的sum成员里。等所有迭代完成,这个临时对象会被拷贝给s,此时s的sum才会变成最终的累加结果。若只想为s赋值单个元素,应如何编写代码?
有几种实现方式:
- 最直接的写法:先构造对象再调用运算符
Sum s; s(10); // 10为你要赋值的单个元素 - 利用匿名对象初始化的写法:
Sum s = []{ Sum temp; temp(10); return temp; }(); - 给
Sum结构体新增带参构造函数,简化初始化:struct Sum { void operator()(int n) { sum += n; } // 新增构造函数,直接初始化sum Sum(int n) : sum(n) {} int sum {0}; }; // 直接用单个元素初始化s Sum s(10);
内容的提问来源于stack exchange,提问作者barribow
相关产品推荐
相关产品推荐

