首页 > 解决方案 > 为什么'for_each'不读取函数对象

问题描述

#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在 Sum 类中添加值resfor_each应该是调用s's operator(),所以结果应该是 30,但它显示 0。

我认为在向量中添加值没有问题。为什么s.operator()不工作?

标签: c++

解决方案


for_each它的第三个参数按值获取,这意味着每次调用都会operator()影响s. 有一种算法可以准确地用于您正在做的事情std::accumulate,但是如果您希望它与它一起工作,for_each您需要使用from传递s“通过引用” 。std::ref<functional>

for_each(vec.begin(), vec.end(), ref(s));

推荐阅读