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