如何将独立模板函数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
相关产品推荐
相关产品推荐

