4

有谁知道为什么

  vector<int> test(10);
  int a=0;

  for_each(test.begin(),test.end(),(_1+=var(a),++var(a)));

  for_each(test.begin(),test.end(),(cout << _1 << " "));
  cout << "\n"

给出:“0 1 2 3 4 5 6 7 8 9”

  transform(test.begin(),test.end(),test.begin(), (_1+=var(a),++var(a)));
  ...(as before)

给出:“1 2 3 4 5 6 7 8 9 10”

?

4

3 回答 3

9

逗号运算符从左到右求值,因此

_1+=var(a), ++var(a)

是 ++var(a),您将使用转换版本存储它。

  • for_each:

    _1 += var(a) 被评估,更新你的序列(通过 lambda _1),然后 ++var(a) 被评估,但这对你的序列没有影响。

  • 转换:

    _1+=var(a) 被评估,更新你的序列(就像以前一样),然后 ++var(a) 被评估,这也给出了整个表达式的结果,然后用于再次更新你的序列(通过转换)

于 2008-11-25T11:47:17.613 回答
2

本质上,在中for_each您提供了一个具有副作用的函数,而在中transform,您使用了函数的返回值。

在您的情况下,您重用相同的功能。因为operator +=碰巧有一个返回值,所以这是作为转换结果使用的那个。

于 2008-11-25T12:11:00.530 回答
2

变换(test.begin(),test.end(),test.begin(), (_1+=var(a),++var(a)));

这将转化为

int doit(int & elem) {
    elem += a;
    return ++a;
}

for each elem : elem = doit(elem);

以 a=0 开头将在第一次运行中生成 1。我们将 a 递增 10 次,因此我们将在最后一次运行中得到 10。


for_each(test.begin(),test.end(),(_1+=var(a),++var(a)));

这将转化为

void doit(int & elem) {
    elem += a;
    ++a;
}

for each elem : doit(elem);

从 a=0 开始,我们将在第一次运行时得到 0。我们将 a 增加 10 次,但在增加之前分配它。因此最后一个数字是 9。

我希望现在通过将这两个函数转换为普通函数已经清楚了。

于 2008-11-25T12:26:04.633 回答