21

我正在尝试std::accumulatestd::min. 像这样的东西(不会编译):

vector<int> V{2,1,3};   
cout << accumulate(V.begin()+1, V.end(), V.front(), std::min<int>);

是否可以?是否可以不为 编写包装函子std::min
我知道我可以用 lambdas 做到这一点:

vector<int> V{2,1,3};   
cout << std::accumulate(
    V.begin()+1, V.end(),
    V.front(), 
    [](int a,int b){ return min(a,b);}
);

我知道有std::min_element。我不是想找到最小元素,我需要std::accumulatestd::min(或::min)结合用于我的库,它允许像 C++ 中的表达式一样进行函数编程。

4

2 回答 2

24

问题是函数几个重载min

template <class T> const T& min(const T& a, const T& b);

template <class T, class BinaryPredicate>
const T& min(const T& a, const T& b, BinaryPredicate comp);

因此,您的代码是模棱两可的,编译器不知道选择哪个重载。您可以通过使用中间函数指针来说明您想要哪一个:

#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
  std::vector<int> V{2,1,3};
  int const & (*min) (int const &, int const &) = std::min<int>;
  std::cout << std::accumulate(V.begin() + 1, V.end(), V.front(), min);
}
于 2012-07-24T07:59:23.573 回答
0

从 C++20 开始,您可以使用 std::范围::min

#include <algorithm>
#include <iostream>
#include <vector>
#include <numeric>
#include <climits>

int main() {
    std::vector<int> v{1,2,3,47,5};
    std::cout << std::accumulate(v.begin(), v.end(), INT_MAX, std::ranges::min) << std::endl; 
    std::cout << std::accumulate(v.begin(), v.end(), INT_MIN, std::ranges::max) << std::endl; 
}

1
47

请注意,没有std::ranges::accumulate,因为它不是为 C++20 完成的。

于 2021-09-15T16:01:24.167 回答