seleccion resueltos principiantes por para ordenamiento insercion flujo ejercicios diagrama dev convertir basicos c++ c++11 templates stl overloading

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:

  1. ¿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.
  2. ¿Es correcto suponer que esto se convirtió en un problema en C ++ 11, después de que se introdujo la sobrecarga initializer_list de min ? Entonces, C ++ 11 rompió el código en el que se basó explícitamente la instancia de std::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);