You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于C++ accumulate()函数滑动窗口求和结果异常的咨询

问题原因与修正方案

这个问题的核心是你误解了std::accumulate的迭代器范围规则!

std::accumulate的前两个参数定义的是左闭右开的区间:它会累加从first迭代器指向的元素开始,到last迭代器指向的元素之前的所有元素(简单说就是包含first,不包含last)。

你的代码里把结束迭代器写成了nums.begin()+i+k-1,这就导致每次只累加了k-1个元素,而非预期的k个,这就是结果和你计算的滑动窗口和不符的根本原因:

  • 第一个窗口:i=0,区间是nums.begin()到nums.begin()+3,对应元素是1,12,-5,和为1+12-5=8,和你看到的输出一致;
  • 第二个窗口:i=1,区间是nums.begin()+1到nums.begin()+4,对应元素是12,-5,-6,和为12-5-6=1;
  • 第三个窗口:i=2,区间是nums.begin()+2到nums.begin()+5,对应元素是-5,-6,50,和为-5-6+50=39。

修正后的代码

只需要把accumulate的结束迭代器改成nums.begin()+i+k,就能覆盖完整的k个滑动窗口元素:

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,0)<<" ";

运行这段修正后的代码,输出就会是你预期的2 51 42,完全符合每个滑动窗口的元素和计算结果。

内容的提问来源于stack exchange,提问作者Ashutosh Saurabh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:27:54