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_listdemin? 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);