resueltos - ordenamiento por seleccion c++
Usando `std:: min` como un parĂ¡metro de algoritmo (2)
Envuélvelo en un lambda:
std::partial_sum(v.begin(), v.end(), v.begin(), [](auto& a, auto& b) {
return std::min(a, b);
});
Así que me encontré con este problema: necesito reemplazar cada elemento del std::vector<int>
con el mínimo de lo que venía antes (incluido).
Naturalmente, std::partial_sum
viene a la mente: si pudiera pasar std::min
como BinaryOp
, haría el trabajo.
Resulta que no puedo hacer eso porque std::min<int>
es una función sobrecargada; funciona tanto para int
como initializer_list<int>
y la plantilla partial_sum
no se puede crear una instancia con el tipo desconocido.
Por lo general, esto se resuelve teniendo una clase con un operator()
con plantilla operator()
, como std::plus<void>
etc., pero la biblioteca estándar no parece tener una para min
y max
.
Siento que tengo que implementar mi propia T min<T>(T,T)
, que será un clon exacto de std::min
con la excepción de no tener una sobrecarga de initializer_list
, o implementar mi propia class min
akin a std::plus
. Ambos se sienten un poco mal porque uno esperaría que la biblioteca estándar tuviera una cosa tan básica, y las cosas básicas a menudo son difíciles de implementar :)
Asi que aqui están mis preguntas:
- ¿Hay alguna forma adecuada de resolver el problema en cuestión? es decir, sin introducir nuevas construcciones vagas / escribir más de un par de líneas de código.
- ¿Es correcto suponer que esto se convirtió en un problema en C ++ 11, después de que se introdujo la sobrecarga
initializer_list
demin
? Entonces, C ++ 11 rompió el código en el que se basó explícitamente la instancia destd::min
?
¡Gracias!
Puede inicializar una variable de puntero a función del tipo apropiado y pasar eso, o explícitamente static_cast.
int& (*min)(int&, int&) = std::min<int>;
std::partial_sum(v.begin(), v.end(), v.begin(), min);