If Anweisung wird übersprungen
-
@manni66 sagte in If Anweisung wird übersprungen:
@Bushmaster sagte in If Anweisung wird übersprungen:
use at() instead
Das ist aber eine schlechte Empfehlung.
jetzt sag bloß nicht, at() hat auch irgendwelche fiesen nebeneffekt.
-
@Bushmaster sagte in If Anweisung wird übersprungen:
@manni66 sagte in If Anweisung wird übersprungen:
@Bushmaster sagte in If Anweisung wird übersprungen:
use at() instead
Das ist aber eine schlechte Empfehlung.
jetzt sag bloß nicht, at() hat auch irgendwelche fiesen nebeneffekt.
Nein, aber es macht nicht, was du denkst. Außer du denkst es wäre ok, im Fall eines Nicht-Auffindens eine Exception aus deiner Funktion zu werfen. Mag in seltenen Sonderfällen gewünscht sein, im typischen Anwendungsfall aber nicht.
@Bushmaster sagte in If Anweisung wird übersprungen:
ich bin keiner der sehr auf const-correctness achtet.
Es soll ja auch Leute geben, die ohne Gurt fahren…
-
@Bushmaster sagte in If Anweisung wird übersprungen:
jetzt sag bloß nicht, at() hat auch irgendwelche fiesen nebeneffekt.
Nein, aber es ist potentiell langsamer. Es wird von einigen Befürwortern zwar bestritten, dass es langsamer ist, und dafür werden gern Trivialbeispiele angeführt. Aber insbesondere im HPC optimiert man auf Cache Hits, d.h. dann kann der Overhead von
.at()
zum Tragen kommen.
-
@john-0 sagte in If Anweisung wird übersprungen:
@Bushmaster sagte in If Anweisung wird übersprungen:
jetzt sag bloß nicht, at() hat auch irgendwelche fiesen nebeneffekt.
Nein, aber es ist potentiell langsamer. Es wird von einigen Befürwortern zwar bestritten, dass es langsamer ist, und dafür werden gern Trivialbeispiele angeführt. Aber insbesondere im HPC optimiert man auf Cache Hits, d.h. dann kann der Overhead von
.at()
zum Tragen kommen.Kannst du es mal lassen, in jedem Thread Unsinn zu posten?
-
@SeppJ sagte in If Anweisung wird übersprungen:
Es soll ja auch Leute geben, die ohne Gurt fahren…
Einige jonglieren dabei auch Kettensägen. Ganz verrückte programmieren in C++.
-
@SeppJ sagte in If Anweisung wird übersprungen:
Außer du denkst es wäre ok, im Fall eines Nicht-Auffindens eine Exception aus deiner Funktion zu werfen.
eine exception zu werfen ist doch das einzig richtige, wenn ein operator oder eine funktion theoretisch jeden beliebigen output haben kann (was einen dedizierten fehlercode verbietet). es ist auf jeden fall sinnvoller, als die map einfach aufzublähen. das kann zu fehlern führen, die jahrelang unentdeckt bleiben. just my 2 ct.
-
Nö ist nicht das einzigrichtige. Man kann auch sicherstellen, dass der Key auch in der map ist z.B. mit find.
-
-
@Tyrdal sagte in If Anweisung wird übersprungen:
Nö ist nicht das einzigrichtige. Man kann auch sicherstellen, dass der Key auch in der map ist z.B. mit find.
ob die funktion nun find oder at heißt, ist letztlich egal.
bis auf den psychologischen effekt vielleicht: at riecht nach O(1), aber find nach O(n)
-
@Jockelx sagte in If Anweisung wird übersprungen:
Oder count, was ich schöner finde.
Aber nur, wenn man wissen möchte, ob der Key enthalten ist.
Für die Frage, ob der Key enthalten und wenn ja, welchen Wert er hat (was hier im Beispiel der Fall war), will man ja nicht den Hash-Lookup doppelt durchführen (1x zum Testen, 1x zum Auslesen), wenn find es auch mit 1x (zum Testen UND zum Auslesen) erledigt.
-
@SeppJ sagte in If Anweisung wird übersprungen:
Kannst du es mal lassen, in jedem Thread Unsinn zu posten?
Unsinn? Unsinn ist Deine Anmerkung und sonst nichts.
-
@Bushmaster sagte in If Anweisung wird übersprungen:
at riecht nach O(1), aber find nach O(n)
Wie zur Hölle kommst du denn darauf? Beide müssen den Key suchen. Warum sollte sich da was unterscheiden? Nebenbei sind diese Komplexitäten auch im Standard dokumentiert, also mehr lesen und weniger annehmen.
-
Aber insbesondere im HPC optimiert man auf Cache Hits, d.h. dann kann der Overhead von .at() zum Tragen kommen.
Du benutzt
std::map
im high-performance Sektor? Also einen red-black tree der jeden Knoten mitnew
alloziert?Und weshalb sprechen wir von Cache-hits, wo es hier um zwei Funktionen
operator[]
/at
geht, deren einziger Unterschied darin besteht, was eine branch, die im gegebenen Rahmen (Key soll bereits existieren) als "unlikely" kategorisiert wird, macht?
-
@Tyrdal sagte in If Anweisung wird übersprungen:
Wie zur Hölle kommst du denn darauf? Beide müssen den Key suchen. Warum sollte sich da was unterscheiden? Nebenbei sind diese Komplexitäten auch im Standard dokumentiert, also mehr lesen und weniger annehmen.
semantisch entspricht ein at() dem []-array-operator. da sollte nichts gesucht werden. warum eine map ein at() oder ein [] allerdings als 'suchen' oder O(n) implementiert, ist mir allerdings nicht klar.
-
@Bushmaster Wieso sollte map::operator[] dem vector::operator[] ( oder array[] ) entsprechen? Das sindoch völlig unterschiedliche Datenstrukturen?! Selbstverständlich muss man in einer map suchen, dafür ist sie doch da!
-
@Bushmaster sagte in If Anweisung wird übersprungen:
@Tyrdal sagte in If Anweisung wird übersprungen:
Wie zur Hölle kommst du denn darauf? Beide müssen den Key suchen. Warum sollte sich da was unterscheiden? Nebenbei sind diese Komplexitäten auch im Standard dokumentiert, also mehr lesen und weniger annehmen.
semantisch entspricht ein at() dem []-array-operator. da sollte nichts gesucht werden. warum eine map ein at() oder ein [] allerdings als 'suchen' oder O(n) implementiert, ist mir allerdings nicht klar.
Wie soll das gehen, dass du prüfst, ob etwas existiert, ohne danach gesucht zu haben?
Außerdem: Wie kommst du auf O(n)? Du scheinst Maps nicht im geringsten verstanden haben, aber die Doku hast du offensichtlich auch nicht gelesen.Wieso liest du nicht zuerst die Doku, bevor du wild herum spekulierst? Zumal dir das nun schon wiederholt gesagt wurde…
-
@SeppJ sagte in If Anweisung wird übersprungen:
Wie soll das gehen, dass du prüfst, ob etwas existiert, ohne danach gesucht zu haben?
key und value sind schon vorher bekannt. man kann den zugriff optimieren. vielleicht kommt man nicht ganz auf O(1). aber fast.
-
@Bushmaster sagte in If Anweisung wird übersprungen:
@SeppJ sagte in If Anweisung wird übersprungen:
Wie soll das gehen, dass du prüfst, ob etwas existiert, ohne danach gesucht zu haben?
key und value sind schon vorher bekannt. man kann den zugriff optimieren. vielleicht kommt man nicht ganz auf O(1). aber fast.
Hör endlich auf zu spekulieren und lies, was eine Map ist!
Aber selbst ohne Lesen muss dir doch sofort klar sein, dass das Unsinn ist. Wie soll das magisch anders gehen, etwas zu finden, als etwas zu suchen? Wo soll da die Optimierung stecken? Suchen: Ich gucke, ob an der Stelle, an der es sein müsste, wirklich etwas ist. Finden: Ich hole das Ding von der Stelle, an der es sein müsste. Wie kommst du in einem der Fälle schneller oder langsamer zu der fraglichen Stelle? Denken vor Schreiben!
-
@SeppJ sagte in If Anweisung wird übersprungen:
Hör endlich auf zu spekulieren und lies, was eine Map ist!
ist schon okay. ich akzeptiere wie es ist. bitte kein streit.
-
@Bushmaster Es gibt hier keinen Streit, und erst Recht nicht von einem Mod initiiert. Versuche einfach, deine Annahmen besser zu überprüfen, bevor du Schlussfolgerungen postest.