请考虑以下示例:
#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);
}
Run Code Online (Sandbox Code Playgroud)
我期望总和25,但它打印0.为什么f保持不变?有人能详细介绍一下发生了什么吗?
那是因为std::for_each按值而不是通过引用来获取其仿函数.它在内部操作的副本,f并且您传入的那个保持不变.它返回的函子还给你,所以你可以只覆盖你:
accum f = std::for_each(vi.begin(), vi.end(), accum());
Run Code Online (Sandbox Code Playgroud)
或者,坚持使用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);
Run Code Online (Sandbox Code Playgroud)
虽然你可能只想要std::accumulate:
int sum = std::accumulate(vi.begin(), vi.end(), 0);
Run Code Online (Sandbox Code Playgroud)
或者,在C++ 11中,for_each使用lambda:
int sum = 0;
std::for_each(vi.begin(), vi.end(), [&](int a){ sum += a; });
Run Code Online (Sandbox Code Playgroud)