所以我遇到了这个问题:我需要将std::vector<int>
的每个元素替换为它之前的最小值(包括在内)。
自然会想到std::partial_sum
- 如果我可以将std::min
作为BinaryOp
传递,那么它就可以完成任务。
事实证明我无法做到这一点因为std::min<int>
是一个重载函数 - 它适用于int
和initializer_list<int>
并且partial_sum
模板无法实例化与未知类型。
通常可以通过设置带有模板化operator()
的类来解决此问题,例如std::plus<void>
等,但标准库似乎没有min
和max
的类。
我觉得我要么必须实现自己的T min<T>(T,T)
,这将是std::min
的精确克隆,除了没有initializer_list
重载,或者实现我自己的class min
类似于std::plus
。两者都觉得有点不对,因为人们会期望标准库有这样一个基本的东西,而且基本的东西通常很难实现:)
所以这是我的问题:
initializer_list
的{{1}}重载之后,假设这成为C ++ 11中的问题是否正确?所以C ++ 11破坏了依赖于显式实例化min
的代码?谢谢!
答案 0 :(得分:31)
用lambda包裹它:
std::partial_sum(v.begin(), v.end(), v.begin(), [](auto& a, auto& b) {
return std::min(a, b);
});
答案 1 :(得分:20)
您可以初始化适当类型的指针到函数变量并传递它,或者显式地static_cast。
int& (*min)(int&, int&) = std::min<int>;
std::partial_sum(v.begin(), v.end(), v.begin(), min);
答案 2 :(得分:0)
如果以上内容无法编译,请尝试添加const修饰符:
const int& (*min)(const int&, const int&) = std::min<int>;