c++ stl accumulate

c++ - ¿Es posible usar std:: acumular con std:: min?



stl accumulate (2)

El problema es que hay varias sobrecargas de la función 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);

Por lo tanto, su código es ambiguo, el compilador no sabe qué sobrecarga elegir. Puedes indicar cuál quieres usando un puntero de función intermedia:

#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); }

Estoy tratando de combinar std::accumulate con std::min . Algo como esto (no compilará):

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

¿Es posible? ¿Es posible hacerlo sin escribir el envoltorio functor para std::min ?
Sé que puedo hacer esto con las 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);} );

Y sé que hay std::min_element . No estoy tratando de encontrar el elemento min, necesito combinar std::accumulate con std::min (o ::min ) para mi biblioteca que permite la programación de funciones como expresiones en C ++.


Pregunta muy antigua, pero puede ayudar a alguien más :) Encuentre la suma mínima acumulada.

C ++ 14:

/* Find the minimum accumulate sum. input 4 4 -66 0 -11 output -73 Explanation: First sum == 4, minimum = 4 then, sum == 4 + -66 = -62, minimum == -62 -62 + 0 = -62, minimum == -62 -62 + -11 = -73, minimum == -73 */ #include <bits/stdc++.h> using namespace std; typedef vector<int> vi; const int INF = 1e9; int main(){ int n; cin >> n; vi v; for (int i = 0 ; i < n ; ++i){ int x; cin >> x; v.push_back(x); } int min_sum = v.front(); accumulate(v.begin() + 1, v.end(), min_sum, [&min_sum](auto &x1, auto &x2){ min_sum = min(min_sum, x1 + x2); return x1 + x2; }); cout << "Minimum is: " << min_sum << ''/n''; return 0; }