首页 > 解决方案 > 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)?

标签: c++c++14accumulate

解决方案


如果你真的做了什么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 迭代器中删除。


推荐阅读