for_each c++ c++11 deprecated c++14 stl-algorithm

for_each - c++ apply function to vector



¿Por qué los métodos std:: shuffle están en desuso en C++ 14? (4)

De acuerdo con el sitio de referencia de cppreference.com en std :: shufle , el siguiente método está en desuso en c ++ 14:

template< class RandomIt > void random_shuffle( RandomIt first, RandomIt last );

¿Por qué ya no podremos llamar a la siguiente función sin pasar un tercer parámetro?

std::random_shuffle(v.begin(),v.end()); //no longer valid in c++14

No parece que una deceleración de función diferente tenga un conjunto de parámetros predeterminado. Cuál es la razón detrás de esto? ¿Hubo algún tipo de alternativa agregada?


random_shuffle se está desaprobando porque su RNG no está especificado, no solo porque no tiene que especificarlo, sino porque el estándar no lo especifica. En VC ++, por ejemplo, utiliza rand() , ¡que se implementa muy mal!


std::random_shuffle es (efectivamente) reemplazado por std::shuffle . Necesita pasar un tercer parámetro (un generador de números aleatorios), pero a cambio obtiene una definición y comportamiento (típicamente) mucho mejores.

std::random_shuffle fue bastante pobremente definido. Normalmente usaba rand() para generar los números aleatorios, pero nada decía si (y si es así cómo) llamaba srand , por lo que no podías depender (por ejemplo) de rand sembraba como querías (y si lo siembraste) , no puedes depender de que se ponga en uso). Si la memoria sirve, también hay un lenguaje confuso (y algo autocontradictorio) que podría interpretarse como diciendo que random_shuffle no podría usar rand en absoluto, y / o que no podría srand con srand . Incluso en el mejor de los casos, muchas implementaciones de rand() fueron bastante pobres, por lo que, incluso en el mejor de los casos, no se podía depender de resultados útiles.

En random_shuffle : random_shuffle no es una pérdida. Use std::shuffle en su lugar, y su código será mucho mejor para eso.


Podemos encontrar la justificación en este documento N3775: Deprecating rand y Friends que dice:

Por lo tanto, ahora proponemos ejecutar el siguiente paso de este plan para desalentar el uso del rand de función C tradicional, así como su srand de función de siembra asociado y el límite superior macro RAND_MAX. 6 En particular, proponemos comenzar esta transición desaprobando formalmente:

  • rand, srand y RAND_MAX y
  • Algoritmo random_shuffle () (manteniendo aleatorio, sin embargo).

La justificación para desaprobar random_shuffle () es que una sobrecarga se especifica para que dependa de rand, mientras que la otra sobrecarga se especifica para requerir un objeto de distribución difícil de producir por parte del usuario; dicha distribución ya es una parte implícita de shuffle, que conservamos.

y el documento posterior Discouraging rand () en C ++ 14, v2 que reitera esta posición.

Actualizar

Como Howard Hinnant señala que N3775 tiene un error: rand_shuffle() está permitido, pero no es obligatorio, para usar rand() bajo el capó, pero eso no cambiaría la lógica.


std::random_shuffle puede hacer uso, bajo el capó, de random familia de funciones C al random . Estas funciones usan estado global para semillas y otro estado.

Por lo tanto, se está desaprobando porque shuffle hará lo mismo, pero mejor. A saber, utiliza el nuevo encabezado <random> de C ++ 11 que no utiliza el estado global, sino sus propios objetos haciendo uso de generadores, dispositivos y distribuciones.