Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

boost lambda for_each / transform puzzle

Tags:

c++

lambda

boost

Does anybody know why

  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"

Gives : "0 1 2 3 4 5 6 7 8 9"

but

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

Gives : "1 2 3 4 5 6 7 8 9 10"

?

like image 815
Chris Huang-Leaver Avatar asked Dec 13 '22 06:12

Chris Huang-Leaver


2 Answers

Comma operator evaluates left to right, so the result of the

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

is ++var(a), which you'll store using the transform version.

  • for_each:

    _1 += var(a) is evaluated, updating your sequence (via the lambda _1), then ++var(a) is evaluated, but this has no effect on your sequence.

  • transform:

    _1+=var(a) is evaluated, updating your sequence (just like before), then ++var(a) is evaluated, this also gives the result of the whole expression, then that is used to update your sequence again (via the transform)

like image 130
Pieter Avatar answered Dec 15 '22 18:12

Pieter


Essentially, in the for_each you provide a function with a side-effect, while in the transform, your use the returnvalue of a function.

In your case, you reuse the same function. Since operator += happens to have a return value, this is the one used as a result of the transformation.

like image 37
xtofl Avatar answered Dec 15 '22 20:12

xtofl