提升lambda for_each / transform puzzle

时间:2008-11-25 11:39:57

标签: c++ boost lambda

有谁知道为什么

  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”

3 个答案:

答案 0 :(得分:9)

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

的结果
_1+=var(a), ++var(a)

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

  • 的for_each:

    评估

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

  • 变换:

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

答案 1 :(得分:2)

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

在您的情况下,您重复使用相同的功能。由于operator +=碰巧有一个返回值,因此这是转换后使用的值。

答案 2 :(得分: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。我们增加了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。我们增加10次,但在递增之前分配它。因此最后一个数字是9。

我希望现在很清楚普通功能的翻译是这两个人做的。