gpt4 book ai didi

c++ - 使用 STL 数字的意外参数传递顺序

转载 作者:行者123 更新时间:2023-11-28 04:53:49 26 4
gpt4 key购买 nike

我想我在下面的代码中遗漏了一些东西,最后两次调用的输出在 accumulate 中仅使用容器的一个元素进行迭代导致将该元素作为第二个参数而不是第一个参数传递,或者我没有得到关于如何利用它的想法:

#include <iostream>
#include <numeric>
#include <array>
using namespace std;

int foo(int x, int y) {return 2*x+y;}
int foo2(int x, int y) {return x+2*y;}

int main() {

array<int, 2> arr {{1, 2}};
cout << accumulate(arr.begin(), arr.end(), 0)
<< endl; // 1 + 2 = 3 as expected
cout << accumulate(arr.begin(), arr.end(), 0, foo)
<< endl; // 2*1+2 = 4 as expected
cout << accumulate(arr.begin(), arr.end()-1, 0, foo)
<< endl; // not 2*1+0 but 2*0+1 => 1!
cout << accumulate(arr.begin(), arr.end()-1, 0, foo2)
<< endl; // not 1+2*0 but 0+2*1 = > 2!

return 0;
}

输出:

3
4
1
2

最佳答案

accumulate 的第三个参数是初始累加值。因此,它作为第一次调用累积函数的第一个参数传递。您已正确推导出最后两个值的计算:

accumulate(arr.begin(), arr.end()-1, 0, foo)
// = foo(0, 1) = 2*0 + 1 = 1
accumulate(arr.begin(), arr.end()-1, 0, foo2)
// = foo2(0, 1) = 0 + 2*1 = 2

但是,前两个值的计算方式完全相同:

accumulate(arr.begin(), arr.end(), 0)
// = add(add(0, 1), 2) = (0 + 1) + 2 = 3
accumulate(arr.begin(), arr.end(), 0, foo)
// = foo(foo(0, 1), 2) = 2*(2*0 + 1) + 2 = 4

在这两种情况下,您(错误地)预期的计算会产生相同的结果,这纯属偶然。

关于c++ - 使用 STL 数字的意外参数传递顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47603414/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com