for_each 中的 C++ 函子意外行为
C++ functor unexpected behavior in for_each
考虑以下示例:
#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
保持不变?谁能给我详细说说是怎么回事?
那是因为 std::for_each
通过 value 而不是通过引用获取其函子。它在内部对 f
的副本进行操作,而您传入的副本保持不变。它确实 return 将仿函数返回给您,因此您可以直接覆盖您的仿函数:
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; });
考虑以下示例:
#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
保持不变?谁能给我详细说说是怎么回事?
那是因为 std::for_each
通过 value 而不是通过引用获取其函子。它在内部对 f
的副本进行操作,而您传入的副本保持不变。它确实 return 将仿函数返回给您,因此您可以直接覆盖您的仿函数:
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; });