有谁知道为什么
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”
答案 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。
我希望现在很清楚普通功能的翻译是这两个人做的。