使用`std :: min`作为算法参数

时间:2017-06-04 11:48:48

标签: c++ c++11 templates stl overloading

所以我遇到了这个问题:我需要将std::vector<int>的每个元素替换为它之前的最小值(包括在内)。

自然会想到std::partial_sum - 如果我可以将std::min作为BinaryOp传递,那么它就可以完成任务。

事实证明我无法做到这一点因为std::min<int>是一个重载函数 - 它适用于intinitializer_list<int>并且partial_sum模板无法实例化与未知类型。

通常可以通过设置带有模板化operator()的类来解决此问题,例如std::plus<void>等,但标准库似乎没有minmax的类。

我觉得我要么必须实现自己的T min<T>(T,T),这将是std::min的精确克隆,除了没有initializer_list重载,或者实现我自己的class min类似于std::plus。两者都觉得有点不对,因为人们会期望标准库有这样一个基本的东西,而且基本的东西通常很难实现:)

所以这是我的问题:

  1. 是否有任何正确的方法来解决相关问题?即不引入新的模糊结构/编写超过几行代码。
  2. 在引入initializer_list的{​​{1}}重载之后,假设这成为C ++ 11中的问题是否正确?所以C ++ 11破坏了依赖于显式实例化min的代码?
  3. 谢谢!

3 个答案:

答案 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>;