c++函数for_each中的意外行为

C++ functor unexpected behavior in for_each

本文关键字:意外 each 函数 for c++      更新时间:2023-10-16

考虑以下示例:

#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=%dn",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 : %dn", f.sum);
}

我期望和是25,但它打印0。为什么f保持不变?谁能给我详细说明一下发生了什么事?

这是因为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 : %dn", 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; });