c++ - C++中的accumulate()函数会加负数吗?
问题描述
vector<int> nums={1,12,-5,-6,50,3};
int k=4;
int n=nums.size();
for(int i=0;i<=n-k;i++)
cout<<accumulate(nums.begin()+i,nums.begin()+i+k-1,0)<<" ";
上述代码的输出为:8 1 39
问题是为什么 [1,12,-5,-6] 的总和是 8,应该是 2=(1+12-5-6) ?
与 1 相同,应为 51=(50+12-5-6),并且
39 也一样,应该是 42=(50+3-6-5)?
解决方案
如果你真的做了什么accumulate
- 按顺序添加 - 并查看每个部分结果,你会看到
1 + 0 = 1
1 + 12 = 13
13 + -5 = 8
8 + -6 = 2
12 + 0 = 12
12 + -5 = 7
7 + -6 = 1
1 + 50 = 51
-5 + 0 = -5
-5 + -6 = -11
-11 + 50 = 39
39 + 3 = 42
在这一点上,您可能会发现accumulate
结果是前三个数字的总和,而不是四个。
然后你大声惊呼说有一个错误accumulate
使它忽略了最后一个元素。
然后您查看文档并注意到范围的结尾是“最后一个元素之后的一个”,因此您的结束迭代器 ,nums.begin() + i + 4 - 1
表示它之前的元素(即,*(begin() + i + 2)
来自 的第三个元素begin() + i
)是最后一个元素范围内。
标准库中的所有迭代器范围(和索引间隔)都以这种方式半开。
-1
解决方案是从 end 迭代器中删除。
推荐阅读
- database - 我必须在前端加载 scorm 包还是必须在后端解包并单独提供资产?
- javascript - 如何在同一页中使多个阅读更多阅读更少按钮
- python - 将 Normal CDF 应用于 spark 数据框列
- python - Python 自定义进程池:如何等待众多进程中的一个?
- c# - Estimote 信标和 Xamarin 表单
- vba - 在vba中将值设置为过滤的excel范围
- javascript - Ag-Grid 在新数据源上重置滚动
- excel - SAS - 用百分比格式化 proc 报告总计
- javascript - 如果存在成对的大括号,则只允许特定的字符串正则表达式
- javascript - JS 命令禁止字母,只允许数字(光盘机器人)