意外参数通过使用STL数字的顺序
unexpected argument pass order employing stl numeric
我想我在以下代码中缺少某些内容。最后两个呼叫的输出迭代,在累积结果中仅一个容器的一个元素将一个元素作为第二个参数而不是首先,或者我还没有了解如何利用它:
#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
只是偶然地,在这两种情况下,(错误)预期的预期会产生相同的结果。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 在C应用程序中运行C++(带有STL)函数
- 找到两对数字,使它们的乘积的绝对差最小化
- 使用2个键的cpp-stl::优先级队列排序不正确
- 意外参数通过使用STL数字的顺序
- 如何使用 stl 找到不在集合中的最小数字?
- 使用 STL C++ 对数字 USIG 绝对值进行排序
- STL 按排序顺序存储数字
- 在 C++ STL 中,如何使用 regex_replace 从 std::string 中删除非数字字符
- C++STL列表崩溃,数字超过1000 000 000 000
- 是否有stl或boost函数来确定字符串是否为数字