意外参数通过使用STL数字的顺序

unexpected argument pass order employing stl numeric

本文关键字:STL 数字 顺序 参数 意外      更新时间:2023-10-16

我想我在以下代码中缺少某些内容。最后两个呼叫的输出迭代,在累积结果中仅一个容器的一个元素将一个元素作为第二个参数而不是首先,或者我还没有了解如何利用它:

#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

hwoever,前两个值以完全相同的方式计算:

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

只是偶然地,在这两种情况下,(错误)预期的预期会产生相同的结果。