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

C++使用accumulate计算前缀和首元素为0的问题如何解决

问题根因

std::accumulate的计算规则是左闭右开区间[起始迭代器, 结束迭代器)的元素和,第一次循环时迭代器指向列表首个元素,[liste.begin(), itr)对应空区间,所以计算结果为0,这是输出不符合预期的直接原因。

同时原有实现每次循环都从头遍历列表累加,时间复杂度为O(n²),列表元素较多时效率很低,更推荐使用单次遍历维护累加变量的写法,时间复杂度可优化到O(n)。

最优修改代码
#include <list>
#include <iostream>
using namespace std;

list<int> summe(list<int> liste) {
    list<int> neueListe;
    list<int>::iterator itr;
    int sum = 0; 
    
    cout << "Liste mit Summen: " << endl;
    cout << "{ " << endl;
    for (itr = liste.begin(); itr != liste.end(); itr++) {
        sum += *itr;
        neueListe.push_back(sum);
        cout << sum << endl;
    }
    cout << " }";
    return neueListe;
}

// main函数无需修改
int main() {
    //Aufgabe 2.2 Teil 2
    list<int> l = { 1,2,3,4,5 };
    Algo a;
    a.summe(l);
}
保留accumulate用法的修改方案

如果需要保留accumulate的调用逻辑,只需将结束迭代器替换为当前迭代器的下一个位置即可,需要先引入<iterator>头文件使用std::next:

// 头文件新增引用
#include <iterator>
#include <numeric>

// 循环内修改accumulate调用行
sum = accumulate(liste.begin(), next(itr), 0);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:24:06