【问题标题】:C++ functor unexpected behavior in for_eachfor_each 中的 C++ 函子意外行为
【发布时间】:2015-08-21 01:35:29
【问题描述】:

考虑以下示例:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class accum
{
public:
    int sum;
    accum()
    {
        sum = 0;
    }
    void operator() (int a)
    {
        sum += a;
        printf("sum=%d\n",sum);
    }
};

int main()
{
     int ari[] = {2,8,5,9,1};
     vector<int> vi(&ari[0], &ari[5]);
     accum f;
     for_each(vi.begin(), vi.end(), f);
     printf("final sum : %d\n", f.sum);
}

我预计总和是25,但它打印出0。为什么f 保持不变?有人可以详细说明发生了什么吗?

【问题讨论】:

    标签: c++ stl functor


    【解决方案1】:

    这是因为std::for_each 通过 获取其函子,而不是通过引用。它在f 的副本上内部运行,而您传入​​的副本保持不变。它确实返回函子给你,所以你可以覆盖你的:

    accum f = std::for_each(vi.begin(), vi.end(), accum());
    

    或者,坚持使用 C++03,让accum 参考:

    struct accum {
        int& sum;
        // rest as before, fixing the constructor
    };
    
    int sum = 0;
    std::for_each(vi.begin(), vi.end(), accum(sum));
    printf("final sum : %d\n", sum);
    

    虽然你可能只想要std::accumulate:

    int sum = std::accumulate(vi.begin(), vi.end(), 0);
    

    或者,在 C++11 中,for_each 带有 lambda:

    int sum = 0;
    std::for_each(vi.begin(), vi.end(), [&](int a){ sum += a; });
    

    【讨论】:

    • 谢谢。很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 2018-03-05
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多