Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext
1 2 3 4 5 const std::vector<unsigned int> getRatings() { std::vector<unsigned int> ratings(inputCount); for (auto &entry : ratings) std::cin >> entry; return ratings; }
C-/C++-Quelltext
1 2 3 4 5 6 7 8 std::inner_product( std::begin(ratingsForAlice), std::end(ratingsForAlice), std::begin(ratingsForBob), std::pair<unsigned int, unsigned int>{0, 0}, std::plus<>(), [](auto A, auto B) { return std::make_pair<unsigned int, unsigned int>(A>B,A<B); } );
C-/C++-Quelltext
1 2 3 std::pair<unsigned int, unsigned int> score(0, 0) for(size_t index = 0; index < ratingsForAlice.size(); index++) score += std::make_pair<unsigned int, unsigned int>(ratingsForAlice[index]<ratingsForBob[index],ratingsForAlice[index]>ratingsForBob[index]);
C-/C++-Quelltext
1 2 3 4 5 6 unsigned int score_A, score_B; for(size_t index = 0; index < ratingsForAlice.size(); index++) { score_A += ratingsForAlice[index]<ratingsForBob[index]; score_B += ratingsForAlice[index]>ratingsForBob[index]; }
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Was konkret stört dich z.B. an http://www.cplusplus.com/ ?
Alter Hase
Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy
@Nimelrian danke für das interessante Beispiel - aber mal ganz häretisch gefragt: ist da nicht manches ein wenig overkill? Also z.B. hätte ich erwartet, dass man getRatings eher so implementiert (bin leider nicht mehr sooo fit in C++ und schon garnicht in den neuen Standards, daher bitte ich um Nachsicht und Aufklärung, falls das Folgende kompletter Quark ist ):
C-/C++-Quelltext
1 2 3 4 5 const std::vector<unsigned int> getRatings() { std::vector<unsigned int> ratings(inputCount); for (auto &entry : ratings) std::cin >> entry; return ratings; }
Für das Punkte Zusammenzählen hätte ich jetzt eher std::inner_product erwartet:
C-/C++-Quelltext
1 2 3 4 5 6 7 8 std::inner_product( std::begin(ratingsForAlice), std::end(ratingsForAlice), std::begin(ratingsForBob), std::pair<unsigned int, unsigned int>{0, 0}, std::plus<>(), [](auto A, auto B) { return std::make_pair<unsigned int, unsigned int>(A>B,A<B); } );
Aber vermutlich funktioniert das so garnicht. Am Ende fände ich aber folgendes fast noch "besser" - was ggf. altbacken ist, aber auch in Richtung von Thoran Aussage geht - am Ende zählt oft nicht wieviel moderne Mittel man verwendet, sondern wie gut es funktioniert und wartbar ist:
C-/C++-Quelltext
1 2 3 std::pair<unsigned int, unsigned int> score(0, 0) for(size_t index = 0; index < ratingsForAlice.size(); index++) score += std::make_pair<unsigned int, unsigned int>(ratingsForAlice[index]<ratingsForBob[index],ratingsForAlice[index]>ratingsForBob[index]);
oder ganz klassisch:
C-/C++-Quelltext
1 2 3 4 5 6 unsigned int score_A, score_B; for(size_t index = 0; index < ratingsForAlice.size(); index++) { score_A += ratingsForAlice[index]<ratingsForBob[index]; score_B += ratingsForAlice[index]>ratingsForBob[index]; }
Aber das Originalbeispiel zeigt schon eindrucksvoll, was mit der stl so zur Verfügung steht.
Alter Hase
Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy
Ich finde manchmal, dass die STL dann doch ein wenig mit Kanonen auf Spatzen schießt. Es gibt für alle möglichen Fälle irgend eine template Funktion, was man allerdings auch schön in einer ganz normalen loop machen könnte. Wenn ich mir da vor allem mal std::transform anschaue, weiß ich nicht genau, worin jetzt der Vorteil zu einer ordinären loop sein soll. Überseh ich da was?
Anderes Beispiel ist da std::remove(_if). Das ist eigentlich so das beste Beispiel. Es tut eigentlich nicht das, was es sagt. Es sortiert lediglich die Elemente in der Range, es entfernt sie nicht. Das muss man außerhalb nochmal selbst tun.
Keine Ahnung wer sich das ausgedacht hat, aber schön ist es nicht.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Nimelrian« (13.08.2017, 02:27)
Es geht bei sowas vor allem um Aussagekraft. Bei transform weiß ich sofort, dass jedes Element einer Range auf ein neues Element gemapped wird. Bei accumulate weiß ich, dass alle Elemente einer Range zu genutzt werden, um ein einzelnes Ergebnis zu bauen. Ein anderer, sehr cooler Algorithmus der STL ist übrigens stable_partition.
Werbeanzeige