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

如何将独立模板函数std::max作为二元操作传入std::partial_sum?

问题

我有一个大小为n的std::vector<int> v1,想要构建一个std::vector<int> v2,使得对于[0, n)范围内的每个i,v2[i] = max(v1[i], ..., v1[n-1])。尝试用std::partial_sum反向实现时写了如下代码:

std::partial_sum(v1.rbegin(), v1.rend(), v2.rbegin(), std::max);

但编译失败,报错couldn't deduce template parameter '_BinaryOperation'。看到std::partial_sum的示例用std::plus<>()这种函数对象的语法,而std::max是重载的函数模板,请问该怎么正确使用std::max完成需求?

原因分析

编译失败的核心是std::max存在多个重载版本(比如接受两个参数的模板版本、接受初始化列表的版本),编译器无法自动推导哪一个版本适配std::partial_sum要求的二元操作符参数。而std::plus<>()是实例化后的函数对象,不存在重载歧义,所以能被正常推导。

解决方法

方法1:显式指定std::max的模板参数

直接指定std::max的模板类型,消除重载歧义:

std::partial_sum(v1.rbegin(), v1.rend(), v2.rbegin(), std::max<int>);

方法2:用lambda包装std::max

通过lambda明确调用双参数版本的std::max,避免重载匹配问题:

// 提前确保v2的大小和v1一致
v2.resize(v1.size());
std::partial_sum(v1.rbegin(), v1.rend(), v2.rbegin(),
    [](int a, int b) { return std::max(a, b); });

方法3:使用自定义函数对象(类似std::plus)

如果需要复用逻辑,可以自定义封装std::max的函数对象:

struct MaxOp {
    template<typename T>
    T operator()(const T& a, const T& b) const {
        return std::max(a, b);
    }
};

// 调用时传入实例
std::partial_sum(v1.rbegin(), v1.rend(), v2.rbegin(), MaxOp{});

注意事项

使用std::partial_sum前必须确保v2已经分配了足够的空间(大小与v1相同),否则会触发未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:01:19