#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
template <class T>
class Sum {
public:
Sum(T i = 0) : res(i) {}
void operator()(T x) { res =res + x; }
T result() const { return res; }
private:
T res;
};
int main() {
Sum<int> s;
vector<int> vec;
vec.insert(vec.begin(), 10);
vec.insert(vec.begin()+1, 10);
vec.insert(vec.begin()+2, 10);
vector<int>::iterator itr = vec.begin();
cout << *itr << endl;
for_each(vec.begin(), vec.end(), s);
cout << "sum is" << s.result() << endl;
return 0;
}
这是我的代码。我想在总和vec
类中添加res
值。 for_each
应调用s
的{{1}},因此结果应为30,但显示为0。
我认为在向量中增加价值没有问题。为什么operator()
无法正常工作?
答案 0 :(得分:4)
for_each
通过值采用第三个参数,这意味着operator()
的每次调用都会影响s
的完全独立的副本。有一种完全适合您的算法,称为std::accumulate
,但是如果您希望此算法与for_each
一起使用,则需要使用s
通过引用传递std::ref
来自<functional>
。
for_each(vec.begin(), vec.end(), ref(s));
答案 1 :(得分:3)
for_each
返回传入函子的副本,该函子提供迭代的“结果”(无论结果如何)。将您的通话更改为:
auto s = for_each(vec.begin(), vec.end(), Sum<int>());