std::partial_sum 是 C++ 标准库中计算前缀和的正确函数,定义在 头文件中,不存在 std::partial_sum_c++;它支持自定义二元操作、原地或复制累加,但需确保输出空间足够且迭代器类型匹配。

std::partial_sum 是 C++ 标准库中计算前缀和(累加和)的正确函数,std::partial_sum_c++ 并不存在 —— 这是常见拼写或记忆错误,直接编译会报 error: 'partial_sum_c++' is not a member of 'std'。
为什么找不到 std::partial_sum_c++
标准库中只有 std::partial_sum,名字里没有下划线加 c++ 后缀。这个错误通常源于:误把教程标题当函数名、IDE 自动补全干扰、或混淆了某些第三方库/博客的自定义别名。
-
std::partial_sum定义在头文件中,必须显式包含 - 它支持输入迭代器范围 + 输出迭代器,不修改原容器也可输出到新容器
- 默认执行“加法”累加,但可通过第 4 个参数传入任意二元操作(如
std::multiplies{}做前缀积)
基本用法:一维 vector 的前缀和
最常用场景:对 std::vector 原地或复制生成前缀和数组。
#include#include #include std::vector v = {1, 2, 3, 4}; std::vector prefix(v.size()); std::partial_sum(v.begin(), v.end(), prefix.begin()); // → prefix = {1, 3, 6, 10}
- 第三个参数是输出起始位置,可以是
v.begin()实现原地累加(覆盖原值) - 输出容器必须预留足够空间(
resize或构造时指定大小),否则行为未定义 - 若输入为空区间(
begin == end),函数不执行任何操作,安全
容易踩的坑:迭代器类型与 const 容器
对 const 容器取 begin() 得到的是 const_iterator,不能作为 std::partial_sum 的输出目标 —— 编译失败。
立即学习“C++免费学习笔记(深入)”;
- 错误写法:
std::partial_sum(v.cbegin(), v.cend(), v.begin())(输入 const,输出非 const,类型不匹配) - 正确做法:确保输出迭代器可写,且与输入值类型兼容;如需从 const 容器生成前缀和,必须另开一个非 const 容器接收
- 注意:
std::partial_sum不支持输入为std::list的reverse_iterator直接算“后缀和”,需先反转拷贝或手写循环
进阶技巧:自定义运算与多维降维累加
前缀和不只能加;配合 lambda 或函数对象,能实现条件累加、模意义下累加等逻辑。
// 模 1000000007 前缀和 std::vectora = {1, 10, 100}; std::vector mod_prefix(a.size()); std::partial_sum(a.begin(), a.end(), mod_prefix.begin(), [](long long x, long long y) { return (x + y) % 1000000007; });
- 第 4 个参数是二元函数:第一个参数是当前累加结果(即“已处理部分”的聚合值),第二个是下一个输入元素
- 该函数必须满足结合律才能保证语义一致(加法、乘法满足;max/min 也满足,但要注意初始值)
- 二维数组想按行做前缀和?得用循环套一层
std::partial_sum,它本身只处理一维范围
真正要小心的是输出空间是否分配、迭代器 const 性是否匹配、以及自定义 op 的初始状态隐含逻辑 —— 这些地方出错不会报明显错误,但结果可能静默异常。











