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

