Warum std::shuffle Methoden als deprecated in C++14?
Entsprechend der cppreference.com Referenz-Website auf std::shufle, die folgende Methode ist als deprecated in c++14:
template< class RandomIt >
void random_shuffle( RandomIt first, RandomIt last );
Warum werden wir nicht mehr in der Lage, rufen Sie die folgende Funktion, ohne über einen Dritten parameter?
std::random_shuffle(v.begin(),v.end()); //no longer valid in c++14
Es nicht so erscheinen, als ob eine andere Funktion Verzögerung hat einen default-parameter eingestellt. Was ist der Grund dafür? War es irgendeine Art von alternative Hinzugefügt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::random_shuffle
kann Gebrauch machen, unter der Haube, derrandom
C-Familie von Funktionen. Diese Funktionen verwenden die globalen Zustand für Samen und andere Staatliche.Also es ist veraltet, weil
shuffle
wird das gleiche tun, aber besser. Nämlich, es verwendet die neue<random>
header von C++11, der nicht mit globalen Staates, sondern eigene Objekte, die Nutzung von Generatoren, Geräte und Verteilungen.std::random_shuffle
kann verwendenrand
. Es ist nicht erforderlich zu verwendenrand
. Einige Implementierungen tun, und einige tun nicht.std::random_shuffle
ist (effektiv) ersetzt durchstd::shuffle
. Sie tun müssen, um einen Dritten parameter (a random number generator), aber im Austausch dafür bekommst du wesentlich bessere definition und (in der Regel) Verhalten.std::random_shuffle
war ziemlich schlecht definiert. Es in der Regel verwendetrand()
zum generieren der Zufallszahlen, aber nichts gesagt, ob (und wenn ja, wie) es genanntsrand
, so dass Sie konnte nicht hängen (für ein Beispiel) inrand
wird ausgesät, wie Sie wollten (und wenn Sie ausgesät, Sie konnte sich nicht darauf verlassen, dass die Verwendung). Wenn der Speicher dient, es war auch etwas verwirrend (und etwas widersprüchlich) Sprache, die interpretiert werden könnten, als zu sagen, dassrandom_shuffle
nicht nutzen konnterand
an alle, und/oder, dass es konnte nicht und bepflanzen es mitsrand
. Selbst am besten, viele Implementierungen vonrand()
waren ziemlich schlecht, so dass selbst bei sehr besten konnte man Sie nicht davon abhängen, nützliche Ergebnisse.Bottom line:
random_shuffle
ist kein Verlust. Verwendenstd::shuffle
statt, und der code wird viel besser für Sie.std::shuffle
. Ich sehe keinen wirklichen Grund, es lieber überstd::shuffle
obwohl.shuffle
wurde in Erster Linie eingeführt...RandomNumberGenerator
imrandom_shuffle
hat eine andere API als dieUniformRandomNumberGenerator
imshuffle
tut. Letztere hat eine API im Einklang mit der Uniform random number generator Anforderungen in [rand.req.urng]. Das ehemalige hat eine API ist nur in der requires-Klauselrandom_shuffle
.Finden wir die Begründung, die in diesem Dokument N3775: Abwertend rand und Freunde, die sagt:
und die späteren Dokument Entmutigend rand() in C++14, v2, die bekräftigt diese position.
Update
Als Howard Hinnant Hinweise
N3775
hat einen Fehler:rand_shuffle()
ist erlaubt, aber nicht erforderlich, umrand()
unter der Haube, aber das würde nicht ändern, die Begründung.rand_shuffle()
angegeben ist, so hängtrand
. Es ist richtig zu sagen, dass es erlaubt ist, umgesetzt werden auf obenrand
. Aber es ist nicht erforderlich, um durchgeführt werden, auf der Oberseite derrand
.random_shuffle
ist veraltet, weil seine RNG ist nicht näher-nicht nur, dass Sie nicht haben, um es zu spezifizieren, aber die Norm selbst ist nicht spezifiziert. Auf VC++, zum Beispiel, verwendet esrand()
implementiert wird wirklich schlecht!