为什么“ for_each”不读取函数对象

时间:2018-12-16 03:11:36

标签: c++

#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()无法正常工作?

2 个答案:

答案 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>());