关于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
相关产品推荐
相关产品推荐

