C++ C++;每个函数中的函子意外行为
考虑以下示例:C++ C++;每个函数中的函子意外行为,c++,stl,functor,C++,Stl,Functor,考虑以下示例: #include <iostream> #include <vector> #include <algorithm> using namespace std; class accum { public: int sum; accum() { sum = 0; } void operator() (int a) { sum += a; printf(
#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);
}
#包括
#包括
#包括
使用名称空间std;
类累积
{
公众:
整数和;
accum()
{
总和=0;
}
void运算符()(int a)
{
总和+=a;
printf(“总和=%d\n”,总和);
}
};
int main()
{
int ari[]={2,8,5,9,1};
向量vi(&ari[0],&ari[5]);
累计f;
对于每个(vi.开始(),vi.结束(),f);
printf(“最终金额:%d\n”,f.sum);
}
我希望总数是25
,但它打印的是0
。为什么f
保持不变?有人能给我一个详细的情况吗?那是因为它的函子是按值计算的,而不是按引用计算的。它在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);
尽管您可能只想:
或者,在C++11中,对于每个带有lambda的
:
int sum = 0;
std::for_each(vi.begin(), vi.end(), [&](int a){ sum += a; });
非常感谢。非常有用。
int sum = 0;
std::for_each(vi.begin(), vi.end(), [&](int a){ sum += a; });