Подтвердить что ты не робот

Можно ли использовать std:: accumulate с std:: min?

Я пытаюсь объединить std::accumulate с std::min. Что-то вроде этого (не компилируется):

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

Возможно ли это? Можно ли обойтись без написания функтора обертки для std::min?
Я знаю, что могу сделать это с помощью лямбда:

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. Я не пытаюсь найти элемент min, мне нужно объединить std::accumulate с std::min (или ::min) для моей библиотеки, которая позволяет программировать функции как выражения на С++.

4b9b3361

Ответ 1

Проблема в том, что существует несколько перегрузок функции 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);
}