2008-11-25 24 views
4

是否有人知道为什么升压拉姆达的for_each /变换益智

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“

回答

9

逗号运算从左向右,做的

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

结果是++ VAR(一),其中你会使用存储转换的版本。

  • 的for_each:

    _1 + = VAR(a)中进行评价时,更新序列(通过拉姆达_1),然后++ VAR(a)中被评价,但这没有影响你的序列。

  • 变换:

    _1 + = VAR(a)中进行评价时,更新序列(就像之前),然后++ VAR(a)中被评价,这也给出了整个表达式的结果,则用来再次更新您的序列(通过变换)

+0

花了我几个重读,以获得它,但谢谢:-) – 2008-11-25 12:02:46

2

从本质上讲,在for_each你提供一个副作用的功能,而在transform,您使用的函数的返回值。

就你而言,你可以重用相同的功能。由于operator +=恰好具有返回值,因此这是用于转换的结果。

+0

是的。 for_each应该是const,不是吗? – 2008-11-26 13:52:02

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); 

与= 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); 

用= 0开始,我们将在第一轮得0。我们增加10倍,但在增加之前分配它。因此,最后一个数字是9.

我希望通过将普通函数转换为这两个函数,这是很明显的。